方法一:对于在开发环境中,在本项目中找出一个类所有的子类或实现类比较简单,即使是多模块项目,只要以项目根目录为起点,遍历所有.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))去取,会报错,路径不存在,文件找不到。
有大神解决过类似的问题吗?一起探讨探讨吧
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包所在路径