是否可以在运行时指定System ClassLoader加载.class文件?

Gru*_*eck 5 java bytecode classpath classloader java-bytecode-asm

我正在编写一个用于赋值的静态分析工具,它使用ASM库分析Java字节码.我们使用的ASM的一个部分需要(或者至少似乎要求)从ClassLoader加载该类.

我们希望该工具能够分析.class文件,而不需要它们在类路径上.我们已经在运行时从指定目录加载.classes并使用InputStream读取它们.在大多数情况下,这对于ASM是可接受的.有些类,例如SimpleVerifier,尝试加载类.

在这种情况下,是否可以注册要加载的.class文件,以便调用Class.forName()将加载它们?或者是否有一种简单的方法来扩展ClassLoader以允许它?


编辑:URLClassLoader有用的信息.不幸的是,使用Thread.currentThread().setContextClassLoader()它的实例在这种情况下不起作用.我正在调用的库代码使用它在实例初始化时检索的加载器getClass().getClassLoader().

当我设置URLClassLoader时,该类尚未初始化,所以我猜contextClassLoader不加载该类.

我是否正确理解了答案?是否可以使用URLClassLoader加载第三方类?

Kev*_*vin 5

几乎.

如果您在某处编译了类,则可以使用URLClassLoader加载它们.然后,您可以将此ClassLoader设置为当前Thread的ClassLoader:Thread.setContextClassLoader(ClassLoader)

用户可以获取当前线程上下文类加载器并使用它来访问类定义.


Eug*_*hov 5

首先,ASM可以这样使用,它不会使用ClassLoader来获取有关类的信息.

ASM框架中有几个地方默认加载类,但所有这些地方都可以在您自己的子类中重写.脱离我的头脑:

另外,在Sun的JVM上,加载的类到达PermGen区域并且无法卸载,因此如果可以避免这种情况,仅为静态代码分析加载类不是一个好主意,特别是如果工具是集成到一个长期过程中,例如IDE.