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

/*** 获得包下面的所有的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() {@Overridepublic 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();}}}
}

上诉代码的原理为通过当前线程的类加载器去加载到目录下的URL,然后URL去加载类。
但是如果我们需要加载的类是在一个Jar中,则无法采用这种方式,因为此时整个jar被看做了一个文件,无法再通过URL去加载jar中的某个文件。要加载jar中的类则采用如下方式。

获取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);// 也可以采用如下方式把类加载成一个输入流// InputStream in = jarFile.getInputStream(entry);try {clazzs.add(Thread.currentThread().getContextClassLoader().loadClass(className));} catch (ClassNotFoundException e) {e.printStackTrace();}}return clazzs;
}

上诉代码的原理为通过JarEntry加载了Jar中的所有文件,此时通过循环这些文件的文件名,来判断是否属于某个目录下,进而得到目录下的所有文件。

如果加载的是文件而非类

此时可以通过如下方式加载出来输入流对象会比较简洁,但是这种方法文件路径一定要是从跟路径下开始写起,比如对于如下目录结构

要加载approveDev.xml,必须要这样写

InputStream in = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("/config/apollo_xml/adaptorFlow/approveDev.xml");

不可以写成这样

InputStream in = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("/apollo_xml/adaptorFlow/approveDev.xml");   // 错误的写法

不要视图通过加载jar中的文件得到一个File
你是否想过通过加载jar中的文件得到一个File,比如下面这样

File file = new File("jar包中的文件路径")

但其实是没法这样做的,因为整个jar被看做了一个整体,如果你非要得到一个File对象,可以考虑用上面的输入流写出到一个文件中,然后通过加载这个文件来得到一个File对象。实际上非特殊情况也不一定要得到File对象,因为假设你是加载xml,dom4j也提供了通过输入流的方式来加载xml.

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

  1. java 获取classpath下文件多种方式

    java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...

  2. Java获取target下的classes路径

    Java获取target下的classes路径 String resourcePath= ResourceUtils.getURL("classpath:").getPath()

  3. java文件打包jar文件_如何把JAVA文件打包成jar文件

    本文讲解了把java文件打包成jar文件的方法,经测试可行.由于作者没时间用批处理文件进行操作的方法没有列出来. (1)把一个java文件打包到当前目录   javac –d . *.java (2) ...

  4. Mabatis 源码探究(2)Java 获取mybatis-config.xml的输入流 inputStream对象

    关于Mybatis源码探究的专栏. 其我的专业是软件技术这个方向的,mybatis 许久以前就学了,但是心里一直存在一些疑惑.也上网查了,看过各种大佬的博客,对 于Mybatis的理解始终感觉不足.最 ...

  5. java 获取 classpath下的配置文件

    为什么80%的码农都做不了架构师?>>>    一 获取 prop属性文件: /*** 读取属性文件* Created by lg on 2017/2/3.*/ public cla ...

  6. java学习笔记(八)----包,jar文件

    包  //建立包后同一个文件中的类都属于这个包,所有的类都必须按包名所对应的目录,在硬盘中存放.同一个包中的类在相互调用时,是不用指定包名的.    ---在编译时对于下面这个类,用这样的方法  ja ...

  7. java文件打包成jar文件_将java文件打包成jar包步骤

    将mypackage包中的FrameDemo.java文件打包成可执行成jar包 步骤1:先将程序中所有类打包成一个包 编译mypackage包FrameDemo.java文件,将类文件存入D盘Jar ...

  8. java打开jar文件怎么打开_后缀jar文件怎么打开 .jar文件如何打开

    原标题:"详解jar文件怎么打开"相关系统教程分享. 在计算机中,jar是一种软件包文件格式,以zip格式为基础,以便开发Java平台应用软件或库.那么jar文件如何打开呢?今天, ...

  9. java获取method,2.5 反射——Class对象功能_获取Method

    >[info] 反射--Class对象功能_获取Method * Method:方法对象 * 执行方法: * Object invoke(Object obj, Object... args) ...

最新文章

  1. 巨杉斩获“中国十大开源软件”,开源与企业级结合商业路线得到认可
  2. bio和bieos哪个标注模式好_阿里巴巴和亚马逊电商模式差异?哪个电商好做
  3. 在Python中导入自己写的类,被划红线,但不影响执行
  4. oracle slient静默安装并配置数据库及仅安装数据库不配置数据库shell
  5. 9岁女孩联合国演讲上热搜,网友:自愧不如
  6. mysql 服务器 utf8_MySQL编码设置方法 MySQL编码为utf8设置方法
  7. GIT回滚master分支到指定tag版本 并提交远程仓库
  8. mysql lamp 配置命令总结
  9. Windows下安装 rubyinstaller
  10. 软件架构师的12项修炼[4]—个人技能修炼(2)—激情
  11. 数学分析(2): 数列极限
  12. 程序员通过什么渠道接外包项目
  13. 基于SpringBoot+Vue开发的一个知识社区分享平台
  14. 帆软报表设置的参数不显示_FineReport报表工具显示格式和显示值的设置
  15. Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋
  16. html5游戏制作入门系列教程(一)
  17. Python量化编程如何判断均线数据是金叉还是死叉?-股市数据均线策略编程分析
  18. webrtc学习笔记二:webrtc介绍
  19. 数字滤波器matlab仿真_模拟IC笔记(1)——PLL MATLAB建模与行为仿真
  20. LeetCode 题解之 824. Goat Latin

热门文章

  1. facebuilder免费版_FaceBuilder 2.1.1 For Blender 2.8x-2.9x脸头部照片建模纹理插件
  2. 如何在 HTML 网站上创建其他网页
  3. AI System 人工智能系统 TVM深度学习编译器 DSL IR优化 计算图 编译 优化 内存内核调度优化 DAG 图优化 DFS TaiChi 函数注册机 Registry
  4. 人生就是一场直播——经蓓老师莅临大米时代公益讲座
  5. 【七天实战微信小程序】任务清单
  6. 二字动词 复盘赋能_落地、赋能、共创、共建、复盘,互联网圈的漂亮词儿,你懂几个?...
  7. 关于Spring MVC 文件大小超过限制后浏览器无响应解决方案
  8. 怎么用计算机要微信,电脑端要实现“微信双开”功能,三种方法,简单实用!...
  9. KETTLE8.2在linux(rehl)6.6中安装部署并配置公共数据库链接
  10. jstack排查cpu使用率过高