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 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作