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加载第三方类?
几乎.
如果您在某处编译了类,则可以使用URLClassLoader加载它们.然后,您可以将此ClassLoader设置为当前Thread的ClassLoader:Thread.setContextClassLoader(ClassLoader)
用户可以获取当前线程上下文类加载器并使用它来访问类定义.
首先,ASM可以这样使用,它不会使用ClassLoader来获取有关类的信息.
ASM框架中有几个地方默认加载类,但所有这些地方都可以在您自己的子类中重写.脱离我的头脑:
另外,在Sun的JVM上,加载的类到达PermGen区域并且无法卸载,因此如果可以避免这种情况,仅为静态代码分析加载类不是一个好主意,特别是如果工具是集成到一个长期过程中,例如IDE.
| 归档时间: |
|
| 查看次数: |
9263 次 |
| 最近记录: |