我想从给定的Class
中提取所有Class
依赖项(为了使用我的类及其所有依赖项创建Arquillian测试)。
我很想做到这一点(使用CtClass.getRefClasses()
中的Javassist),但我坚持使用泛型(似乎Javassist正确地解析了Generics,but doesn't have any API to get them)。 / p>
目前,我的递归inspect
方法的核心是:
for (String className : (Iterable<String>)ClassPool.getDefault().get(klass.getName()).getRefClasses()) {
try {
inspect(Class.forName(className), classSet); // recursion
} catch ( // ClassNotFoundException and NoClassDefFoundError handling
}
}
该迭代似乎可以正常地获取所有Class
es依赖项,但如果我要检查的Class
正在操作例如List<MyClass>
,我将不会MyClass
1}}来自Collection
返回的getRefClasses()
。
我已检查.class
文件,字节码包含该信息(Ljava/util/List<Lmy/company/MyClass;>;
)。
您是否知道我可以使用另一个API从给定的Class
中提取所有使用过的Class
?
答案 0 :(得分:3)
您可以使用ASM并实现一个访问者,只要访问类型指令或变量声明等,就会记录所有类。您还可以访问签名描述符(即{ {1}})。
但是,并非所有依赖项都将出现在类文件中。假设你创建了一个Ljava/util/List<Lmy/company/MyClass;>;
并且没有将它分配给变量,那么就是类型参数信息will be lost。