2

我想Class从给定中提取所有依赖项Class(以便使用我的类及其所有依赖项创建Arquillian测试)。

我很难做到这一点(使用CtClass.getRefClasses()来自Javassist),但我坚持使用泛型(似乎 Javassist 正确解析泛型,但没有任何 API 来获取它们)。

这是我inspect目前递归方法的核心:

for (String className : (Iterable<String>)ClassPool.getDefault().get(klass.getName()).getRefClasses()) {
    try {
        inspect(Class.forName(className), classSet); // recursion
    } catch ( // ClassNotFoundException and NoClassDefFoundError handling
    }
}

该迭代似乎可以正常工作以获取所有Classes 依赖项,但如果Class我要检查的操作例如 a List<MyClass>,我将不会MyClassCollection返回的 by中获得getRefClasses()

我检查了.class文件,字节码有该信息(Ljava/util/List<Lmy/company/MyClass;>;)。

你知道另一个 API 可以用来从给定的 es中提取所有使用的 es吗?ClassClass

4

1 回答 1

3

您可以使用ASM并实现一个访问者,该访问者在访问类型指令或变量声明等时记录所有类。您还可以获得签名描述符(即Ljava/util/List<Lmy/company/MyClass;>;)。

但是,并非所有依赖项都会出现在类文件中。假设您创建 anew ArrayList<MyClass>并且不将其分配给变量,那么类型参数信息将丢失

于 2012-06-07T09:50:41.723 回答