通过JarPojoHandler类实现了扫描指定路径下如何获取所有的JAR包或class文件,可以对特定class对象文件筛选过滤等,具体代码如下所示import java.io.File;@b@import java.io.FileFilter;@b@import java.io.IOException;@b@import java.net.JarURLConnection;@b@import java.net.URL;@b@import java.net.URLClassLoader;@b@import java.net.URLDecoder;@b@import java.util.ArrayList;@b@import java.util.Enumeration;@b@import java.util.HashMap;@b@import java.util.LinkedHashSet;@b@import java.util.List;@b@import java.util.Map;@b@import java.util.Set;@b@import java.util.jar.JarEntry;@b@import java.util.jar.JarFile;@b@@b@/**@b@ * 扫描指定包(包括jar)下的class文件 
 @b@ */@b@public class JarPojoHandler {@b@private static Map>> pojoClasses = new HashMap>>();@b@@b@/**@b@ * 获得指定路径下的所有 JAR包@b@ * @param strPath@b@ * @return@b@ */@b@public static List getDirFiles(String strPath) {@b@List list = new ArrayList();@b@File f = new File(strPath);@b@if (f.isDirectory()) {@b@File[] fList = f.listFiles();@b@for (int j = 0; j > getClazzInstances(File file, String packages,@b@String current) {@b@try {@b@if (file == null) return null;@b@URLClassLoader loader = new URLClassLoader(new URL[] { new URL(@b@"file:" + file.getAbsolutePath()) }, Thread.currentThread()@b@.getContextClassLoader());@b@List> classinstances = new ArrayList>();@b@JarFile jarFile = new JarFile(file);@b@Enumeration> enum1 = jarFile.entries();@b@List> clzlist = JarPojoHandler.pojoClasses.get(current);@b@if(clzlist == null ) {@b@clzlist = new ArrayList>();@b@pojoClasses.put(current, clzlist);@b@}@b@while (enum1.hasMoreElements()) {@b@JarEntry entry = (JarEntry) enum1.nextElement();@b@if (entry.isDirectory()) continue;@b@String jar = entry.getName();@b@if (jar.endsWith(".class")) {@b@String clzname = jar.substring(0, jar.lastIndexOf(".class")).replace('/', '.');@b@String clzpackage = clzname.substring(0, clzname.lastIndexOf("."));@b@String currentpackage = packages + "." + current + ".bean";@b@if (clzpackage.equals(currentpackage)) {@b@Class> clz = loader.loadClass(clzname);@b@classinstances.add(clz);@b@}@b@if (clzname.startsWith(packages)) {@b@Class> clz = loader.loadClass(clzname);@b@clzlist.add(clz);@b@}@b@}@b@}@b@if(jarFile != null) jarFile.close();@b@return classinstances;@b@} catch (Exception e) {@b@e.printStackTrace();@b@}@b@return null;@b@}@b@@b@public static Set> getClasses(String pack) {@b@// 第一个class类的集合@b@Set> classes = new LinkedHashSet>();@b@// 是否循环迭代@b@boolean recursive = true;@b@// 获取包的名字 并进行替换@b@String packageName = pack;@b@String packageDirName = packageName.replace('.', '/');@b@// 定义一个枚举的集合 并进行循环来处理这个目录下的things@b@Enumeration dirs;@b@try {@b@dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);@b@// 循环迭代下去@b@while (dirs.hasMoreElements()) {@b@// 获取下一个元素@b@URL url = dirs.nextElement();@b@// 得到协议的名称@b@String protocol = url.getProtocol();@b@// 如果是以文件的形式保存在服务器上@b@if ("file".equals(protocol)) {@b@// file类型的扫描@b@// 获取包的物理路径@b@String filePath = URLDecoder.decode(url.getFile(), "UTF-8");@b@// 以文件的方式扫描整个包下的文件 并添加到集合中@b@findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);@b@} else if ("jar".equals(protocol)) {@b@// 如果是jar包文件@b@// 定义一个JarFile@b@// jar类型的扫描@b@JarFile jar;@b@try {@b@// 获取jar@b@jar = ((JarURLConnection) url.openConnection()).getJarFile();@b@// 从此jar包 得到一个枚举类@b@Enumeration entries = jar.entries();@b@// 同样的进行循环迭代@b@while (entries.hasMoreElements()) {@b@// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件@b@JarEntry entry = entries.nextElement();@b@String name = entry.getName();@b@// 如果是以/开头的@b@if (name.charAt(0) == '/') {@b@// 获取后面的字符串@b@name = name.substring(1);@b@}@b@// 如果前半部分和定义的包名相同@b@if (name.startsWith(packageDirName)) {@b@int idx = name.lastIndexOf('/');@b@// 如果以"/"结尾 是一个包@b@if (idx != -1) {@b@// 获取包名 把"/"替换成"."@b@packageName = name.substring(0, idx).replace('/', '.');@b@}@b@// 如果可以迭代下去 并且是一个包@b@if ((idx != -1) || recursive) {@b@// 如果是一个.class文件 而且不是目录@b@if (name.endsWith(".class") && !entry.isDirectory()) {@b@// 去掉后面的".class" 获取真正的类名@b@String className = name.substring(packageName.length() + 1, name.length() - 6);@b@try {@b@// 添加到classes@b@classes.add(Class.forName(packageName + '.' + className));@b@} catch (ClassNotFoundException e) {@b@// .error("添加用户自定义视图类错误 找不到此类的.class文件");@b@e.printStackTrace();@b@}@b@}@b@}@b@}@b@}@b@} catch (IOException e) {@b@// log.error("在扫描用户定义视图时从jar包获取文件出错");@b@e.printStackTrace();@b@}@b@}@b@}@b@} catch (IOException e) {@b@e.printStackTrace();@b@}@b@return classes;@b@}@b@@b@public static void findAndAddClassesInPackageByFile(String packageName,@b@String packagePath, final boolean recursive, Set> classes) {@b@// 获取此包的目录 建立一个File@b@File dir = new File(packagePath);@b@// 如果不存在或者 也不是目录就直接返回@b@if (!dir.exists() || !dir.isDirectory()) {@b@// log.warn("用户定义包名 " + packageName + " 下没有任何文件");@b@return;@b@}@b@// 如果存在 就获取包下的所有文件 包括目录@b@File[] dirfiles = dir.listFiles(new FileFilter() {@b@// 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)@b@public boolean accept(File file) {@b@return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));@b@}@b@});@b@// 循环所有文件@b@for (File file : dirfiles) {@b@// 如果是目录 则继续扫描@b@if (file.isDirectory()) {@b@findAndAddClassesInPackageByFile(packageName + "." + file.getName(), file.getAbsolutePath(), recursive, classes);@b@} else {@b@// 如果是java类文件 去掉后面的.class 只留下类名@b@String className = file.getName().substring(0, file.getName().length() - 6);@b@try {@b@// 添加到集合中去@b@// classes.add(Class.forName(packageName + '.' +  className));@b@// 经过回复同学的提醒,这里用forName有一些不好,会触发static方法,没有使用classLoader的load干净@b@classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className));@b@} catch (ClassNotFoundException e) {@b@// log.error("添加用户自定义视图类错误 找不到此类的.class文件");@b@e.printStackTrace();@b@}@b@}@b@}@b@}@b@@b@public static Map>> getPojoClasses() {@b@return pojoClasses;@b@}@b@@b@public static void realese() {@b@pojoClasses.clear();@b@}@b@@b@}

java扫描包下类_实现获取扫描指定包路径下的jar文件或class文件JarPojoHandler类示例代码...相关推荐

  1. java当中有关循环的代码_有关Java循环的内容,编程中还是比较常用的,下面分享给大家几个循环的示例代码,练习一下。1、循环输出1到100之间所有能被3或能被4整除的数。pack...

    有关Java循环的内容,编程中还是比较常用的,下面分享给大家几个循环的示例代码,练习一下. 1.循环输出1到100之间所有能被3或能被4整除的数. package com.hz.loop02; /** ...

  2. 安卓抓包软件_你们要的抓包神器!以及抓包原理

    昨天讲到 农行提固定额度失败原因查看方法! 发现好多卡友对这个抓包很有兴趣,今天就着重讲讲抓包的流程. 先讲讲这个抓包的原理:我们手机里面的银行app和服务器连接,把银行app看成是A,把服务器看成是 ...

  3. js如何实现扫描身份证识别_移动端扫描身份证获取获取身份证信息。

    移动端扫描身份证获取身份证信息(前端部分) 最近做了个扫描身份证的功能主要分以下几个步骤 1:使用H5+调用手机底层相机拍照功能 if(window.plus){ playCamera(); }els ...

  4. 打印机可以打印不能扫描怎么弄_打印机无法扫描怎么解决 打印机无法扫描相关介绍【解决方法】...

    导语:打印机是办公场所的重要办公工具,许多企业都会为自己配备一台打印机以方便日常使用,但是,这种经常使用的工具一旦出现问题就会令人十分头疼,比如我们的打印机突然不能扫描了,遇到这个问题该怎么办呢?今天 ...

  5. pda扫描枪屏幕_快递PDA扫描枪日常保养注意事项

    快递PDA扫描枪又叫巴枪作为快递员日常工作中不可缺少的设备,在现代物流中使用广泛,使用频率高,使用环境复杂,虽具备高工业等级,但终究是电子产品,平日里要加强维护和保养. 1.每次使用前,都应该检查PD ...

  6. 打印机可以打印不能扫描怎么弄_打印机无法扫描是怎么回事?

    打印机无法扫描是怎么回事?打印机无法扫描的原因是多方面的,遇到打印机无法扫描应该先排查原因,然后再进行相应的修复. 打印机无法扫描时,可以先排查的情况有多种: 1.打印机电源关闭是最常见,也是最容易被 ...

  7. java 包图_九步实现UML包图创建

    本文和大家一起讨论一下UML包图的概念,包是一个UML结构,它使得你能够把诸如用例或类之类模型元件组织为组.包被描述成文件夹,可以应用在任何一种UML图上. UML包图简介 一个"包图&qu ...

  8. jquery java json转字符串_用jQuery以及JSON包将表单数据转为JSON字符串

    用jQuery以及JSON包将表单数据转为JSON字符串 [日期:2013-01-10] 来源:Linux社区 作者:Linux [字体:大 中 小] 提供一个将表单数据转为json对象,再转为字符串 ...

  9. java查看对象地址_如何获取到JAVA对象所在的内存地址

    展开全部 1.首先打开java构造方法代码. 2.接下来就可以获得网卡物理地址方法代码. 3.然32313133353236313431303231363533e4b893e5b19e31333431 ...

最新文章

  1. 1月23日服务器例行维护更新公告,1月24日服务器例行维护公告(已完成)
  2. 网页 内部转发和网址输入不同
  3. 识别TLS加密恶意流量
  4. 搭建kubernetes DashBoard
  5. 虚拟机和Docker的最大区别
  6. java 集合 延迟加载_java-如何测试延迟加载的JPA集合是否已初始化?
  7. 为什么是容器,Docker和Kubernetes?
  8. Kotlin学习笔记26 协程part6 协程与线程的关系 Dispatchers.Unconfined 协程调试 协程上下文切换 Job详解 父子协程的关系
  9. 账号密码数据库加密说明
  10. 【老牌系统】如何增大C盘空间
  11. python怎么用反三角函数_反三角函数怎么用
  12. 保存位图位图保存时上下颠倒?
  13. 顺丰,四通一达,京东,百世,天天,德邦快递接口java-demo【快递100API】
  14. ios 高德获取定位_概述-iOS 定位SDK | 高德地图API
  15. 世纪龙校招java开发一、二面 面经
  16. Google Filament 源码学习(二):三方库分类总结
  17. ChatGPT 客户端来喽
  18. 人眼识别与机器识别的联系_机器可以识别笑话吗
  19. 电位器的阻值曲线变化特性解析与应用
  20. FreeMaker语法大全及示例

热门文章

  1. select标签中的选项分组
  2. 求两个字符串的最长公共字串(连续)
  3. HDU-1569 方格取数(2) 最小割最大流
  4. web developer tips (37):如何组织Using指令
  5. Windows性能查看器:系统的性能信息(I/O,IIS最大连接数,Sql) ,以及解决 asp.net IIS 一二百多用户并发...
  6. 聚合(根)、实体、值对象精炼思考总结
  7. 订餐系统之同步饿了么商家订单
  8. dubbo 内存溢出怎么处理_关于 Dubbo 的重要入门知识点总结
  9. GitChat · 大数据 | 一步一步学习大数据:Hadoop 生态系统与场景
  10. 解决nginx 504 Gateway Time-out的一些方法