读取一个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文件总的一个具体文件的路径"); }
相关推荐
在Java开发过程中,有时我们需要对已经打包好的JAR文件中的class文件进行修改,这通常是由于修复bug、更新功能或者优化代码等原因。本文将详细介绍如何在不重新编译整个项目的情况下,修改并替换JAR文件中的class...
在这个场景下,"Java获取ipa、apk文件配置信息jar包"提供了这样的功能,它是一个Java库,能够帮助开发者以编程方式解析ipa和apk文件,提取出关键的元数据。 首先,我们要理解如何在Java中处理ipa和apk文件。ipa文件...
在Spring Boot项目中,通常依赖会被打包到最终的jar文件内部,这在大多数情况下是没问题的。但有时,为了方便部署和管理,我们希望依赖和配置文件能够独立于jar包存在。这可以通过Maven的`maven-jar-plugin`和`maven...
生成JAR包是Java项目打包的一种常见方式,它用于将多个.class文件及相关资源文件打包成一个文件,便于程序的分发和部署。JAR文件的全称是Java Archive,本质上是一个ZIP格式的压缩文件,包含了一个清单文件...
3. 在弹出的窗口中,展开“Java”选项,然后选择“Runnable JAR file”(可运行的JAR文件),点击“Next”(下一步)。 4. 在“Launch configuration”(启动配置)中,选择你要作为主类运行的程序,即包含`public ...
Java源代码编译后生成.class文件,这些文件通常分布在不同的目录结构中,对应于Java的包结构。jar文件则把这些类文件及其依赖的资源打包在一起,便于管理和执行。jar文件内部依然保持类文件的原有目录结构,以便...
Java编程语言以其跨平台性和丰富的库支持而广受欢迎,但为了在不同的系统上运行Java程序,我们需要将编译后的.class文件打包成一个可执行的JAR(Java Archive)文件。本篇文章将详细介绍如何使用C++编写一个小程序来...
本文将详细介绍如何在Eclipse中将项目打包成JAR文件,并确保能正确引用外部JAR包和读取外部配置文件。 首先,我们来看如何打包项目为JAR。在Eclipse中,选择`Export` -> `Java` -> `Runnable JAR file`。在弹出的...
这样就在项目目录下新产生一个目录store,里面就是可以包含外部JAR包的完整的JAR文件。 最后,如果要运行它,可以在DOS环境下输入`java -jar *.jar`命令;或者为了方便,可以建立一个.bat批处理文件。 使用...
Java打Jar包是Java开发过程中常见的一项操作,它将多个类文件、资源文件等打包成一个可执行的JAR(Java Archive)文件,方便分发、部署和运行。本篇文章将详细阐述Java打Jar包的方法,并通过实例进行演示。 1. **...
在Java开发过程中,`jar`(Java Archive)文件是一种重要的组件,它集合了多个`.class`文件和其他资源,便于代码的分发、管理和执行。标题"所有要用到的jar包"表明这是一份包含了项目运行所需全部依赖的集合,而描述...
### 制作可执行的JAR文件包及jar命令详解 #### 可执行JAR文件的概念与优势 在探讨如何创建可执行的JAR文件之前,我们先来了解一下什么是JAR文件以及为什么需要将Java程序打包成可执行的JAR文件。 **JAR (Java ...
在Java编程环境中,获取APK文件的包名和版本信息是一项常见的需求,特别是在自动化测试、应用管理或数据分析等场景中。APK是Android应用程序的安装包,它包含了应用的所有组件和资源。要从APK文件中提取这些元数据,...
它支持多种类型的条目,包括目录、JAR文件和ZIP文件。 - **目录**:指向包含`.class`文件的文件夹。 - **JAR文件**:一种压缩格式,用于打包Java类文件及其关联元数据。 - **ZIP文件**:与JAR文件类似,但不一定...
这里我们主要探讨如何使用DOS命令来测试Java JAR文件,以及如何在命令行下运行JUnit测试。这是一项基础但至关重要的技能,因为通过命令行工具可以高效地自动化测试和调试代码。 首先,让我们了解Java JAR文件。JAR...
4. **生成JAR文件**:成功执行后,会生成一个包含所有必要文件的JAR包。你可以通过双击运行这个JAR,或者在CMD中使用`java -jar YourJarFileName.jar`命令来启动程序。 5. **使用附件中的readme.txt**:附件中的...
Java中的ClassPath和Package是Java开发中至关重要的概念,它们直接影响到Java程序的编译和运行。在这篇文章中,我们将详细探讨这两个主题。 首先,让我们理解什么是ClassPath。ClassPath是Java虚拟机(JVM)查找类...
创建`Document`对象后,可以使用XPath表达式来查找特定节点,例如,获取`<manifest>`标签下的`<application>`标签的`android:label`属性(应用名称)、`<package>`标签(包名)以及`<versionCode>`和`<versionName>`...
Java的JAR(Java Archive)包是Java编程语言中用于集合类和其他资源文件的压缩格式。它是Sun Microsystems为Java平台引入的一种归档格式,旨在方便分发...了解如何创建、运行和管理JAR文件是每个Java开发者的基础技能。
"Java 程序打包成可执行文件示例" Java 程序打包成可执行文件示例是指将 Java 程序编译成....编译将 Java 程序编译成.class 文件,打包将.class 文件和清单文件打包成.jar 文件,转换将.jar 文件转换成.exe 文件。