`
dyy_gusi
  • 浏览: 209551 次
  • 性别: 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就知道自己写的看不下去

相关推荐

    修改jar包中的class文件

    在Java开发过程中,有时我们需要对已经打包好的JAR文件中的class文件进行修改,这通常是由于修复bug、更新功能或者优化代码等原因。本文将详细介绍如何在不重新编译整个项目的情况下,修改并替换JAR文件中的class...

    Java获取ipa、apk文件配置信息jar包

    在这个场景下,"Java获取ipa、apk文件配置信息jar包"提供了这样的功能,它是一个Java库,能够帮助开发者以编程方式解析ipa和apk文件,提取出关键的元数据。 首先,我们要理解如何在Java中处理ipa和apk文件。ipa文件...

    springboot+maven打包demo【将依赖与配置文件打包到jar包外部】

    在Spring Boot项目中,通常依赖会被打包到最终的jar文件内部,这在大多数情况下是没问题的。但有时,为了方便部署和管理,我们希望依赖和配置文件能够独立于jar包存在。这可以通过Maven的`maven-jar-plugin`和`maven...

    如何生成jar包

    生成JAR包是Java项目打包的一种常见方式,它用于将多个.class文件及相关资源文件打包成一个文件,便于程序的分发和部署。JAR文件的全称是Java Archive,本质上是一个ZIP格式的压缩文件,包含了一个清单文件...

    java打包为jar

    3. 在弹出的窗口中,展开“Java”选项,然后选择“Runnable JAR file”(可运行的JAR文件),点击“Next”(下一步)。 4. 在“Launch configuration”(启动配置)中,选择你要作为主类运行的程序,即包含`public ...

    Java打包成jar文件的视频

    Java源代码编译后生成.class文件,这些文件通常分布在不同的目录结构中,对应于Java的包结构。jar文件则把这些类文件及其依赖的资源打包在一起,便于管理和执行。jar文件内部依然保持类文件的原有目录结构,以便...

    自动打包.java文件成.jar的小程序(C++)

    Java编程语言以其跨平台性和丰富的库支持而广受欢迎,但为了在不同的系统上运行Java程序,我们需要将编译后的.class文件打包成一个可执行的JAR(Java Archive)文件。本篇文章将详细介绍如何使用C++编写一个小程序来...

    Eclipse打包成JAR包读取外部JAR包和外部配置文件

    本文将详细介绍如何在Eclipse中将项目打包成JAR文件,并确保能正确引用外部JAR包和读取外部配置文件。 首先,我们来看如何打包项目为JAR。在Eclipse中,选择`Export` -&gt; `Java` -&gt; `Runnable JAR file`。在弹出的...

    如何在netbeans下把java工程打包成jar包

    这样就在项目目录下新产生一个目录store,里面就是可以包含外部JAR包的完整的JAR文件。 最后,如果要运行它,可以在DOS环境下输入`java -jar *.jar`命令;或者为了方便,可以建立一个.bat批处理文件。 使用...

    Java打Jar包方法和实例

    Java打Jar包是Java开发过程中常见的一项操作,它将多个类文件、资源文件等打包成一个可执行的JAR(Java Archive)文件,方便分发、部署和运行。本篇文章将详细阐述Java打Jar包的方法,并通过实例进行演示。 1. **...

    所有要用到的jar包

    在Java开发过程中,`jar`(Java Archive)文件是一种重要的组件,它集合了多个`.class`文件和其他资源,便于代码的分发、管理和执行。标题"所有要用到的jar包"表明这是一份包含了项目运行所需全部依赖的集合,而描述...

    [精华] 制作可执行的JAR文件包及jar命令详解zt

    ### 制作可执行的JAR文件包及jar命令详解 #### 可执行JAR文件的概念与优势 在探讨如何创建可执行的JAR文件之前,我们先来了解一下什么是JAR文件以及为什么需要将Java程序打包成可执行的JAR文件。 **JAR (Java ...

    java获取apk的包名版本信息

    在Java编程环境中,获取APK文件的包名和版本信息是一项常见的需求,特别是在自动化测试、应用管理或数据分析等场景中。APK是Android应用程序的安装包,它包含了应用的所有组件和资源。要从APK文件中提取这些元数据,...

    java中package用法详解

    它支持多种类型的条目,包括目录、JAR文件和ZIP文件。 - **目录**:指向包含`.class`文件的文件夹。 - **JAR文件**:一种压缩格式,用于打包Java类文件及其关联元数据。 - **ZIP文件**:与JAR文件类似,但不一定...

    dos命令测试java jar文件 命令行下运行JUnit测试 命令运行java

    这里我们主要探讨如何使用DOS命令来测试Java JAR文件,以及如何在命令行下运行JUnit测试。这是一项基础但至关重要的技能,因为通过命令行工具可以高效地自动化测试和调试代码。 首先,让我们了解Java JAR文件。JAR...

    将java项目编辑码打包成可自动运行JAR

    4. **生成JAR文件**:成功执行后,会生成一个包含所有必要文件的JAR包。你可以通过双击运行这个JAR,或者在CMD中使用`java -jar YourJarFileName.jar`命令来启动程序。 5. **使用附件中的readme.txt**:附件中的...

    Java 中的 ClassPath 和 Package

    Java中的ClassPath和Package是Java开发中至关重要的概念,它们直接影响到Java程序的编译和运行。在这篇文章中,我们将详细探讨这两个主题。 首先,让我们理解什么是ClassPath。ClassPath是Java虚拟机(JVM)查找类...

    纯java读取apk文件信息(包括版本号,包名等)

    创建`Document`对象后,可以使用XPath表达式来查找特定节点,例如,获取`&lt;manifest&gt;`标签下的`&lt;application&gt;`标签的`android:label`属性(应用名称)、`&lt;package&gt;`标签(包名)以及`&lt;versionCode&gt;`和`&lt;versionName&gt;`...

    java的jar包

    Java的JAR(Java Archive)包是Java编程语言中用于集合类和其他资源文件的压缩格式。它是Sun Microsystems为Java平台引入的一种归档格式,旨在方便分发...了解如何创建、运行和管理JAR文件是每个Java开发者的基础技能。

    将java程序打包成“可执行”文件示例

    "Java 程序打包成可执行文件示例" Java 程序打包成可执行文件示例是指将 Java 程序编译成....编译将 Java 程序编译成.class 文件,打包将.class 文件和清单文件打包成.jar 文件,转换将.jar 文件转换成.exe 文件。

Global site tag (gtag.js) - Google Analytics