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

方法一:对于在开发环境中,在本项目中找出一个类所有的子类或实现类比较简单,即使是多模块项目,只要以项目根目录为起点,遍历所有.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个回答

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包所在路径

Ernest_M
Ernest_M 可能是误解了我的意思,这问题的侧重点不是路径,而是如何读取jar包内二级jar包所包含的所有类。比如:/home/admin/Project/main.jar!/BOOT-INF/lib/child.jar!这就是读取出来的真实路径,在man.jar这个jar包的lib下有个child.jar,如何才读取出所有class文件呢?举个例子,其中之一的class文件是/home/admin/Project/main.jar!/BOOT-INF/lib/child.jar!/com/test/util/ChildClassFoundUtil.class,那么使用Class.forName("com.test.util.ChildClassFoundUtil")就可以反射到这个类的(亲测可以),但是这只是知道路径才能拿,可是如何拿出所有其他的class类?如何遍历得到?这是关键所在
一年多之前 回复
Ernest_M
Ernest_M 首先感谢您的回答。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题