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

标签 java generics bytecode introspection

我想提取所有Class来自给定 Class 的依赖关系(为了使用我的类及其所有依赖项创建 Arquillian 测试)。

我几乎无法做到这一点(使用 CtClass.getRefClasses() 中的 Javassist ),但我坚持使用泛型(似乎 Javassist 正确解析泛型, but doesn't have any API to get them )。

这是我的递归的核心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来自Collection返回者 getRefClasses() .

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

你知道我可以用来提取所有使用过的另一个API吗Class es 来自给定的 Class

最佳答案

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

但是,并非所有依赖项都会出现在类文件中。假设您创建了一个 new ArrayList<MyClass>并且不将其分配给变量,则类型参数信息 will be lost .

关于java - 获取一个类的所有类依赖项(包括泛型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10929263/

相关文章:

java - 类中的新实例

java - Netty:在 ChannelBuffer 中来回交换 ByteOrder

java - 检测返回 null 的方法的静态字节码分析工具?

haskell - 了解 STG

java.io.IOException : Can't process class [class path] (Unsupported version number [55. 0](最大 54.0,Java 10))

java - 带接口(interface)的匿名类

c# - 如何使用 C# 泛型来简化对 WinRT 设置的访问?

java - 在云存储等对象之间共享对象中列表的元素(标准库)

java - 你能定义一个既有下界又有上限的通用界限吗?

java - 是否可以使用 javassist java 核心类进行检测?引导类加载器加载的类