`
dyy_gusi
  • 浏览: 207395 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java获取package下所有的class对象(普通文件包和Jar文件包)

    博客分类:
  • Java
阅读更多

读取一个package路径下面所有的class。

起初觉得很简单,只需要通过IO流找到文件,然后取出下面的所有文件,然后通过反射得到Class对象。

但是发现从普通文件包下面这样做很容易,但是要是package在一个jar文件的下,这就比价麻烦了,因为我们不能通过文件对象File那样直接定位到jar文件下面的内容。所以我们需要使用特殊的方式。

第一种:普通文件安包中的package里面

/**
 * 获得包下面的所有的class
 * 
 * @param pack
 *            package完整名称
 * @return List包含所有class的实例
 */
public static List<Class> getClasssFromPackage(String pack) {
	List<Class> clazzs = new ArrayList<Class>();

	// 是否循环搜索子包
	boolean recursive = true;

	// 包名字
	String packageName = pack;
	// 包名对应的路径名称
	String packageDirName = packageName.replace('.', '/');

	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.out.println("file类型的扫描");
				String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
				findClassInPackageByFile(packageName, filePath, recursive, clazzs);
			} else if ("jar".equals(protocol)) {
				System.out.println("jar类型的扫描");
			}
		}

	} catch (Exception e) {
		e.printStackTrace();
	}

	return clazzs;
}

/**
 * 在package对应的路径下找到所有的class
 * 
 * @param packageName
 *            package名称
 * @param filePath
 *            package对应的路径
 * @param recursive
 *            是否查找子package
 * @param clazzs
 *            找到class以后存放的集合
 */
public static void findClassInPackageByFile(String packageName, String filePath, final boolean recursive, List<Class> clazzs) {
	File dir = new File(filePath);
	if (!dir.exists() || !dir.isDirectory()) {
		return;
	}
	// 在给定的目录下找到所有的文件,并且进行条件过滤
	File[] dirFiles = dir.listFiles(new FileFilter() {

		@Override
		public boolean accept(File file) {
			boolean acceptDir = recursive && file.isDirectory();// 接受dir目录
			boolean acceptClass = file.getName().endsWith("class");// 接受class文件
			return acceptDir || acceptClass;
		}
	});

	for (File file : dirFiles) {
		if (file.isDirectory()) {
			findClassInPackageByFile(packageName + "." + file.getName(), file.getAbsolutePath(), recursive, clazzs);
		} else {
			String className = file.getName().substring(0, file.getName().length() - 6);
			try {
				clazzs.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + className));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 第二种:获取jar文件包中的package下面的所有class

/**
 * 从jar文件中读取指定目录下面的所有的class文件
 * 
 * @param jarPaht
 *            jar文件存放的位置
 * @param filePaht
 *            指定的文件目录
 * @return 所有的的class的对象
 */
public List<Class> getClasssFromJarFile(String jarPaht, String filePaht) {
	List<Class> clazzs = new ArrayList<Class>();

	JarFile jarFile = null;
	try {
		jarFile = new JarFile(jarPaht);
	} catch (IOException e1) {
		e1.printStackTrace();
	}

	List<JarEntry> jarEntryList = new ArrayList<JarEntry>();

	Enumeration<JarEntry> ee = jarFile.entries();
	while (ee.hasMoreElements()) {
		JarEntry entry = (JarEntry) ee.nextElement();
		// 过滤我们出满足我们需求的东西
		if (entry.getName().startsWith(filePaht) && entry.getName().endsWith(".class")) {
			jarEntryList.add(entry);
		}
	}
	for (JarEntry entry : jarEntryList) {
		String className = entry.getName().replace('/', '.');
		className = className.substring(0, className.length() - 6);

		try {
			clazzs.add(Thread.currentThread().getContextClassLoader().loadClass(className));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	return clazzs;

 

 

 此外,我们可以通过JarEntry对象,将jar文件中的一个文件以流的方式输出来

 

/**
	 * 通过流将jar中的一个文件的内容输出
	 * 
	 * @param jarPaht
	 *            jar文件存放的位置
	 * @param filePaht
	 *            指定的文件目录
	 */
	public static void getStream(String jarPaht, String filePaht) {
		JarFile jarFile = null;
		try {
			jarFile = new JarFile(jarPaht);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		Enumeration<JarEntry> ee = jarFile.entries();

		List<JarEntry> jarEntryList = new ArrayList<JarEntry>();
		while (ee.hasMoreElements()) {
			JarEntry entry = (JarEntry) ee.nextElement();
			// 过滤我们出满足我们需求的东西,这里的fileName是指向一个具体的文件的对象的完整包路径,比如com/mypackage/test.txt
			if (entry.getName().startsWith(filePaht)) {
				jarEntryList.add(entry);
			}
		}
		try {
			InputStream in = jarFile.getInputStream(jarEntryList.get(0));
			BufferedReader br = new BufferedReader(new InputStreamReader(in));
			String s = "";

			while ((s = br.readLine()) != null) {
				System.out.println(s);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 测试上面的所有内容

public static void main(String[] args) {
	ClassUtil classUtil = new ClassUtil();
	List<Class> clazzs = classUtil.getClasssFromPackage("包名");//
	for (Class clazz : clazzs) {
		System.out.println(clazz.getName());
	}

	clazzs = classUtil.getClasssFromJarFile("Jar文件的路径", "Jar文件里面的包路径");
	for (Class clazz : clazzs) {
		System.out.println(clazz.getName());
	}

	classUtil.getStream("Jar文件的路径", "Jar文件总的一个具体文件的路径");
}

 

2
0
分享到:
评论
3 楼 youngcoder 2017-12-07  
goodjob
2 楼 dyy_gusi 2013-12-17  
zhangheng159 写道
重复造轮没必要,看下apache common-io或ant就知道自己写的看不下去

谢谢哥们提醒,我也是才在学习的过程中。希望能吸收你们这些大牛的内功。
1 楼 zhangheng159 2013-12-17  
重复造轮没必要,看下apache common-io或ant就知道自己写的看不下去

相关推荐

    javacv-1.5.5.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-1.3.2.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    Java文件转换为 Exe 可执行文件

    软件功能为:将 Jar 文件转换为 Exe 可执行文件。 生成的 Exe 文件在执行时,需要 JRE(Java Runtime Environment)。 2. 用法及举例 本软件在控制台下运行,格式: D:\&gt;J2E &lt;jarfile&gt; /m &lt;mainclass&gt; 说明: jar...

    jna-5.5.0.jar中文文档.zip

    # 含有的 Java package(包)(此处仅列举3个): ``` com.sun.jna com.sun.jna.internal com.sun.jna.platform ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.sun.jna.AltCallingConvention ...

    Java 类查找器_Class Search

    方便的查找出某class文件来自于哪个jar包,适合于64位操作系统。有需要源码的短我,互相交流哈

    javacv-1.4.4.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    jna-5.6.0.jar中文文档.zip

    # 含有的 Java package(包)(此处仅列举3个): ``` com.sun.jna com.sun.jna.internal com.sun.jna.platform ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.sun.jna.AltCallingConvention ...

    javacv-1.5.3.jar中文-英文对照文档.zip

    javacv-***.jar中文-英文对照文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文-英文对照API文档,手册,开发手册,使用手册,参考...

    jna-4.5.2.jar中文文档.zip

    # 含有的 Java package(包)(此处仅列举3个): ``` com.sun.jna com.sun.jna.internal com.sun.jna.platform ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.sun.jna.AltCallingConvention ...

    javacv-1.5.8.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-0.11.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-1.1.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-1.5.1.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-1.0.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-1.5.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-0.10.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-0.9.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-0.8.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-1.5.6.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

    javacv-1.2.jar中文文档.zip

    javacv-***.jar中文文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法:...

Global site tag (gtag.js) - Google Analytics