获取类的所有类依赖项(包括泛型)?

时间:2012-06-07 09:37:43

标签: java generics bytecode introspection

我想从给定的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

1 个答案:

答案 0 :(得分:3)

您可以使用ASM并实现一个访问者,只要访问类型指令或变量声明等,就会记录所有类。您还可以访问签名描述符(即{ {1}})。

但是,并非所有依赖项都将出现在类文件中。假设你创建了一个Ljava/util/List<Lmy/company/MyClass;>;并且没有将它分配给变量,那么就是类型参数信息will be lost