Ernest_M 2018-05-16 06:07 采纳率: 0%
浏览 1839
已结题

利用java反射在jar包下二级jar包中搜索一类的子类或实现类问题

方法一:对于在开发环境中,在本项目中找出一个类所有的子类或实现类比较简单,即使是多模块项目,只要以项目根目录为起点,遍历所有.java结尾的类的路径,用Class.forName(classPath)得到该类 ,然后class1.isAssignableFrom(class2)就可以判断出class2是否为class1的子类或实现类,将满足条件的类放入set即实现了要求。
方法二:第二种情况就是在jar包中寻找,也只需利用JarFile jarFile = new JarFile(new File(path));然后利用Enumeration jarEntryEnum = jarFile.entries();获取jar内的所有文件,找到以.class结尾的编译文件的路径,同样用Java反射,然后用isAssignableFrom判断是否为子类或实现类,就可以满足需求。
但问题来了,在正式环境中,由于是多模块项目,maven打包成jar包,主模块为main.jar在外层,其他模块将以child.jar的模式存在main.jar的BOOT-INF\lib目录下。这时使用方法二,只能找出最外层的.class文件和所有的child.jar文件,由于子类或实现类在其他模块也有,所以也需要去除child.jar中的所有.class文件,这时就实现不了了……因为child.jar是在main.jar文件内部,这时的path,如果用JarFile jarFile = new JarFile(new File(path))去取,会报错,路径不存在,文件找不到。
有大神解决过类似的问题吗?一起探讨探讨吧

  • 写回答

1条回答

  • luotbxiansheng 2018-05-16 06:32
    关注

    getClass().getClassLoader().getResourceAsStream(path), 先是读取jar包内部有没有这个path,如果内部没有时,再读取jar包当前目录下的path, 值得注意的是这个需要有一个实例化类,才能getClass,否则是编译不过的
    this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 得到的是程序运行所在路径
    System.getProperty(“user.dir”); 和 this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath() 是不一样的, System.getProperty(“user.dir”)得到的是用户执行的时候的那个路径,不一定是jar包所在路径

    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题