- 浏览: 367127 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
xujishen:
新入职 写道还是没很明白~~这个BigDecimal.ROUN ...
BigDecimal带精度的运算 -
542348257:
数字为long型的时候 好像处理有点问题
【无聊的笔记】将数字转换为中文读法 -
陈小妞:
当你输入100003980的时候在万位会多一个万字
【无聊的笔记】将数字转换为中文读法 -
stranger520:
可能有问题吧,举个例子: pacage1/User.class ...
java读取指定package下的所有class -
springdata_springmvc:
java程序语言学习教程 地址http://www.zuida ...
java学习——mina篇
之前在看spring注解的时候,有看到再配置文件里面定义component scan package就能自动扫描对应包下面的class,
然后根据注解生成相应的bean。自己对这个功能很好奇,就搜了下,找到了实现的关键代码,记录下。后续再对这段代码深入学习。
/** * 从包package中获取所有的Class * * @param pack * @return */ public static Set<Class<?>> getClasses(String pack) { // 第一个class类的集合 Set<Class<?>> classes = new LinkedHashSet<Class<?>>(); // 是否循环迭代 boolean recursive = true; // 获取包的名字 并进行替换 String packageName = pack; String packageDirName = packageName.replace('.', '/'); // 定义一个枚举的集合 并进行循环来处理这个目录下的things Enumeration<URL> dirs; try { dirs = Thread.currentThread().getContextClassLoader().getResources( packageDirName); // 循环迭代下去 while (dirs.hasMoreElements()) { // 获取下一个元素 URL url = dirs.nextElement(); // 得到协议的名称 String protocol = url.getProtocol(); // 如果是以文件的形式保存在服务器上 if ("file".equals(protocol)) { System.err.println("file类型的扫描"); // 获取包的物理路径 String filePath = URLDecoder.decode(url.getFile(), "UTF-8"); // 以文件的方式扫描整个包下的文件 并添加到集合中 findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes); } else if ("jar".equals(protocol)) { // 如果是jar包文件 // 定义一个JarFile System.err.println("jar类型的扫描"); JarFile jar; try { // 获取jar jar = ((JarURLConnection) url.openConnection()) .getJarFile(); // 从此jar包 得到一个枚举类 Enumeration<JarEntry> entries = jar.entries(); // 同样的进行循环迭代 while (entries.hasMoreElements()) { // 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件 JarEntry entry = entries.nextElement(); String name = entry.getName(); // 如果是以/开头的 if (name.charAt(0) == '/') { // 获取后面的字符串 name = name.substring(1); } // 如果前半部分和定义的包名相同 if (name.startsWith(packageDirName)) { int idx = name.lastIndexOf('/'); // 如果以"/"结尾 是一个包 if (idx != -1) { // 获取包名 把"/"替换成"." packageName = name.substring(0, idx) .replace('/', '.'); } // 如果可以迭代下去 并且是一个包 if ((idx != -1) || recursive) { // 如果是一个.class文件 而且不是目录 if (name.endsWith(".class") && !entry.isDirectory()) { // 去掉后面的".class" 获取真正的类名 String className = name.substring( packageName.length() + 1, name .length() - 6); try { // 添加到classes classes.add(Class .forName(packageName + '.' + className)); } catch (ClassNotFoundException e) { // log // .error("添加用户自定义视图类错误 找不到此类的.class文件"); e.printStackTrace(); } } } } } } catch (IOException e) { // log.error("在扫描用户定义视图时从jar包获取文件出错"); e.printStackTrace(); } } } } catch (IOException e) { e.printStackTrace(); } return classes; }
/** * 以文件的形式来获取包下的所有Class * * @param packageName * @param packagePath * @param recursive * @param classes */ public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, Set<Class<?>> classes) { // 获取此包的目录 建立一个File File dir = new File(packagePath); // 如果不存在或者 也不是目录就直接返回 if (!dir.exists() || !dir.isDirectory()) { // log.warn("用户定义包名 " + packageName + " 下没有任何文件"); return; } // 如果存在 就获取包下的所有文件 包括目录 File[] dirfiles = dir.listFiles(new FileFilter() { // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件) public boolean accept(File file) { return (recursive && file.isDirectory()) || (file.getName().endsWith(".class")); } }); // 循环所有文件 for (File file : dirfiles) { // 如果是目录 则继续扫描 if (file.isDirectory()) { findAndAddClassesInPackageByFile(packageName + "." + file.getName(), file.getAbsolutePath(), recursive, classes); } else { // 如果是java类文件 去掉后面的.class 只留下类名 String className = file.getName().substring(0, file.getName().length() - 6); try { // 添加到集合中去 //classes.add(Class.forName(packageName + '.' + className)); //经过回复同学的提醒,这里用forName有一些不好,会触发static方法,没有使用classLoader的load干净 classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className)); } catch (ClassNotFoundException e) { // log.error("添加用户自定义视图类错误 找不到此类的.class文件"); e.printStackTrace(); } } } }
自己直接拿过来用了,可以扫描package对应的子package,不过是对当前classLoad下的所有jar进行扫描的。
评论
16 楼
stranger520
2015-12-09
可能有问题吧,举个例子:
pacage1/User.class,pacage1/student/Student.class,那个递归,如果递归pacage1目录,就会发现里面有 两个 文件,一个是user.class.一个是student的目录,如果循环先判断 package1/student/,这是个目录,就进入递归了,进入下一级目录了,那么user.class就找不到了,不知我说的是否有理!
pacage1/User.class,pacage1/student/Student.class,那个递归,如果递归pacage1目录,就会发现里面有 两个 文件,一个是user.class.一个是student的目录,如果循环先判断 package1/student/,这是个目录,就进入递归了,进入下一级目录了,那么user.class就找不到了,不知我说的是否有理!
15 楼
来迟了
2015-05-25
我也想知道是在spring 的那个jar包中???
14 楼
luxiaohuo
2015-04-22
找了下spring源码 貌似没找着 感谢博主分享
13 楼
xlaohe1
2014-11-19
请问是spring哪个文件下的?
12 楼
yznxing
2014-02-13
dyy_gusi 写道
yznxing 写道
laser_lu 写道
貌似缺一个函数。。
额。。貌似是的。。
findAndAddClassesInPackageByFile
你们看的都很认真,但是当你们再仔细看一次后,你们就会发现findAndAddClassesInPackageByFile这个函数就是他本生。
哈哈。。。
11 楼
dyy_gusi
2013-12-16
yznxing 写道
laser_lu 写道
貌似缺一个函数。。
额。。貌似是的。。
findAndAddClassesInPackageByFile
你们看的都很认真,但是当你们再仔细看一次后,你们就会发现findAndAddClassesInPackageByFile这个函数就是他本生。
10 楼
RednaxelaFX
2012-09-04
502220545 写道
19. dirs = Thread.currentThread().getContextClassLoader().getResources(
20. packageDirName);
那个返回值是一个URL实例啊 能放到枚举中吗???
20. packageDirName);
那个返回值是一个URL实例啊 能放到枚举中吗???
返回URL的是getResource,没s
9 楼
502220545
2012-09-04
19. dirs = Thread.currentThread().getContextClassLoader().getResources(
20. packageDirName);
那个返回值是一个URL实例啊 能放到枚举中吗???
20. packageDirName);
那个返回值是一个URL实例啊 能放到枚举中吗???
8 楼
caodaoxi
2011-11-02
好文章 我拿走了啊 谢了 受益匪浅
7 楼
long502147
2011-10-27
一直在找这个 呵呵!
6 楼
RednaxelaFX
2010-10-27
话说这种问题困扰着很多人…看看各路大牛们的讨论吧:
Pain point: getting the classes of a Java package
Pain point: getting the classes of a Java package
5 楼
icewubin
2010-10-26
Thread.currentThread().getContextClassLoader()最好缓存一下,这个调用太多的话,会减慢扫描速度的,如果扫描量很多的话,一定要缓存一下。
4 楼
yznxing
2010-10-26
icewubin 写道
findAndAddClassesInPackageByFile不应该用
Class.forName会触发该类中的static代码的。
classes.add(Class.forName(packageName + '.' + className));,而应该用
classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className));
Class.forName会触发该类中的static代码的。
恩 呵呵,很细心哇你!~
这就是class.forname 和 用classload的loadClass的区别了。
恩 , 记录在这里~~~
3q~~~
3 楼
icewubin
2010-10-26
findAndAddClassesInPackageByFile不应该用
Class.forName会触发该类中的static代码的。
classes.add(Class.forName(packageName + '.' + className));,而应该用
classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className));
Class.forName会触发该类中的static代码的。
2 楼
yznxing
2010-05-27
laser_lu 写道
貌似缺一个函数。。
额。。貌似是的。。
findAndAddClassesInPackageByFile
1 楼
laser_lu
2010-05-26
貌似缺一个函数。。
发表评论
-
2013年技术愿望目标
2013-01-07 23:25 0一: 读源码 1:jetty 2:webx,spr ... -
jetty的http协议解析
2012-07-31 23:59 0上篇文章讲到:jetty的connection解析到hand ... -
jetty源码阅读之connection解析到handler调用
2012-07-29 21:58 0前言: 想要处理用户发出的http请求,首先得获得连接 ... -
jetty源码阅读之connector
2012-07-29 14:56 0AbstractConnector @Overr ... -
定时执行Timer的源码阅读
2012-02-22 18:51 1658Timer的实现原理: 1:timer简介; ... -
jetty翻译
2011-09-06 23:50 0异步等待 异 ... -
【转】mysql Host is blocked error错误解决方案
2011-08-01 14:40 2833Host is blocked because of ma ... -
java按值传递
2011-06-28 23:13 0来看看代码 packag ... -
【无聊的笔记】将数字转换为中文读法
2011-06-05 15:43 6209将阿拉伯数字的数变成我们常用的中文读法, 比如说: 1 ... -
用mina网络传输使用ObjectSerializationCodecFactory一个小注意点
2011-04-05 18:18 8655背景: 之前的 一篇介绍mina的博客中,提到通过mi ... -
jboss下的war包的context映射配置
2011-02-10 17:19 0一般web容器都可以在 deploy 目录下放多个war包, ... -
maven war plugin 的filter 配置。
2011-02-10 17:14 0具体可以参考,maven的官方配置。 http://m ... -
【why系列】内部类为什么访问外围内需要用final
2011-01-10 13:16 011111111111111 -
java命令行知多少(反正我知道的比较少)
2010-12-29 17:11 3806打开 %java_home%\bin 下面,看一堆的命令 ... -
【why系列】为什么序列化要实现一个空接口Serializable
2010-12-25 22:16 0啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 -
【why系列】为什么说java是不可变的对象
2010-12-25 22:15 0啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 package ... -
java线程总结
2010-12-23 15:25 01:java启动一个线程,会为每一个线程,分配一个 ... -
【监控】通过jmx获得系统的gc,内存情况
2010-11-27 21:52 6164通过jmx访问jvm知道的Mbean的一些信息,可以取得系统运 ... -
自动动手写原生态jmx,MbeanInfo,invoke
2010-11-16 22:07 1964使用jmx的东东主要包括下面几个步骤了: 发布j ... -
用spring连接jmx
2010-11-14 18:20 1775接着上一篇 “原生态连接jmx”的例子。 上一篇中,发 ...
相关推荐
根据接口类名称和jar文件读取class文件 可以改造成根据package名读取class文件等等。。。 扩展性很强一读既懂
package hustspy.encrypt; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class File...
public class ReadConfigation{ /** * 属性文件全名 */ private static final String PFILE ="Config.properties"; /** * 对应于属性文件的文件对象变量 */ private File m_file = null; /** ...
import java.io.*; /** * FileUtil. Simple file operation class. * * @author BeanSoft * */ public class FileUtil { /** * The buffer. */ protected static byte buf[] = new byte[1024]; /**...
读取PDF文件中的信息 package com.zht; import java.io.File; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.DriverManager; import java.sql....
类转成java源码相容 一个小的实用程序库,用于在运行时将Java源代码编译为* .class对象。 主要针对编写单元测试: Set< String > sources = new HashSet<> (); sources . put( " package a.b; \n " + " public...
package cn.cucsi.ccs; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; ...
* 获得某节点下的某个子节点(指定子节点名称,和某个属性的值) * 即获取parentElement下名字叫childName,并且属性attributeName的值为attributeValue的子结点 * @param parentElement 要获取子节点的...
8.1.3 天上掉下个package 197 8.1.4 包带来了什么? 197 8.2 import语句:化繁为简 200 8.2.1 import语句 200 8.2.2 一网打尽包中所有类 201 8.2.3 import语句带来的小问题 202 8.2.4 默认引入的包 204 8.3 ...
Java 2实用教程(第三版)实验指导与习题解答 清华大学出版社 (编著 耿祥义 张跃平) 实验模版代码 建议使用文档结构图 (选择Word菜单→视图→文档结构图) 上机实践1 初识Java 4 实验1 一个简单的应用程序 ...
读取sd卡图片并且显示到出来 package cn.itcast.test; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import android.graphics.Bitmap; import android.graphics....
8.1.3 天上掉下个package 197 8.1.4 包带来了什么? 197 8.2 import语句:化繁为简 200 8.2.1 import语句 200 8.2.2 一网打尽包中所有类 201 8.2.3 import语句带来的小问题 202 8.2.4 默认引入的包 204 8.3 ...
2.2.2 使用package管理类 33 2.2.3 使用import偷懒 36 2.3 使用ide 38 2.3.1 ide项目管理基础 38 2.3.2 使用了哪个jre 43 2.3.3 类文档版本 45 2.4 重点复习 48 2.5 课后练习 49 chapter3 基础语法 ...
JavaPoet JavaPoet是用于生成.java源文件的Java API。 在执行诸如批注处理或与元数据文件(例如,数据库模式,协议格式)交互之类的操作时,源文件的生成可能非常有用。 通过生成代码,您无需编写样板文件,同时还...
public class HtmlParse { List<String> configList = new ArrayList(); private String savePath = "d:\\htmlParse.txt"; private String reg = "[\u4E00-\u9FA5]+"; Set<String> resultSet = new ...
如果指定的索引目录下已经存在一些索引文件,并且指定create的值为false,则执行向已存在的索引文件中追加索引,就可以看到索引目录下面的文件不会发生变化,程序执行会因为write.lock文件而抛出异常: Exception ...
package org.excel.service; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Field; import java....
为了能完成自动生成 RemoteObject 对象,我编写了一个 Java2ActionScript 的 Ant 任务来自动转换 FlexService 接口以及相关的所有 JavaBean。JavaInterface2RemoteObjectTask 完成一个 Java 接口对象到 RemoteObject...
安卓java读取网页源码 Andorid-learning 目录: 0-0 0-1 1-1 1-2 1-3 1-4 0-0 隐藏顶部栏状态栏 在代码 oncreate: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate...
所有业务逻辑类皆可调用该类 package com.parddu.dao; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.PreparedStatement; ...