【发布时间】:2010-12-24 20:09:39
【问题描述】:
我正在为作业编写一个静态分析工具,它使用 ASM 库分析 Java 字节码。我们使用的 ASM 的其中一个部分要求(或至少似乎要求)从 ClassLoader 加载类。
我们希望该工具能够分析 .class 文件,而不需要它们位于类路径中。我们已经在运行时从指定目录加载 .classes 并使用 InputStream 读取它们。在大多数情况下,这对于 ASM 来说是可以接受的。有一些类,例如SimpleVerifier,会尝试加载这些类。
在这种情况下,是否可以注册要加载的 .class 文件,以便调用 Class.forName() 来加载它们?或者有没有一种简单的方法来扩展 ClassLoader 以允许这样做?
编辑:URLClassLoader 上的信息很有用。不幸的是,在这种情况下,对一个实例使用Thread.currentThread().setContextClassLoader() 不起作用。我调用的库代码使用了一个加载器,它使用getClass().getClassLoader() 在实例初始化时检索到。
当我设置 URLClassLoader 时,该类尚未初始化,所以我猜想 contextClassLoader 没有加载该类。
我是否正确理解了这些回答?是否可以使用 URLClassLoader 加载第 3 方类?
【问题讨论】:
-
我认为 ASM 不需要。
-
为什么你不能创建一个新的类加载器并指向 ASM?
-
@Tom Hawtin:在大多数情况下,可以使用
ClassReader读取类,该ClassReader接受输入流。但是,SimpleVerifier确实尝试加载该类,我们正在使用它来分析某些点的堆栈。如果有替代使用SimpleVerifier和Analyzer在字段分配点检查堆栈的替代方法,则相关信息将是有效答案。 -
@bmargulies,如果可能的话,而且很容易做到,这就是我想要的那种信息。告诉我该怎么做也是一个有效的答案。
-
@Grundlefleck 您找到适合您的案例的有效解决方案了吗?
标签: java classpath classloader bytecode java-bytecode-asm