asm.ObjectWriter.getCommonSuperClass上的ClassNotFoundException

时间:2014-10-26 14:19:46

标签: java

我试图使用asm库检测Apache Commons Math,对于某些类,当我尝试使用ClassWriter将其写入文件时,会抛出ClassNotFoundException

抛出错误的一个类是org/apache/commons/math3/linear/RealVector.class

堆栈跟踪是:

java.lang.RuntimeException: java.lang.ClassNotFoundException: org.apache.commons.math3.linear.Array2DRowRealMatrix
at org.objectweb.asm.ClassWriter.getCommonSuperClass(Unknown Source)
at org.objectweb.asm.ClassWriter.a(Unknown Source)
at org.objectweb.asm.Frame.a(Unknown Source)
at org.objectweb.asm.Frame.a(Unknown Source)
at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source)
at org.objectweb.asm.tree.MethodNode.accept(Unknown Source)
at org.objectweb.asm.tree.MethodNode.accept(Unknown Source)
at org.objectweb.asm.tree.ClassNode.accept(Unknown Source)

我搜索了Exception,我发现的所有内容都与某些cobertura问题或其他无关的图书馆有关。

如果我根本不执行任何仪器,这甚至会发生。我还尝试将缺少的类显式添加到类路径中,但这也没有用。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

问题是环境中的ASM是从引导程序类加载的,而math3类是从另一个类加载器加载的。 当ClassWriter调用“getCommonSuperClass”时,它调用“GetClass()。GetClassLoader()”,这将为他提供引导类加载器。 但是,它正在尝试合并RealVector(已经加载)和Array2DRowRealMatrix的帧,而使用bootstrap类加载器找不到后者。

一种解决方案是,如果您自己使用调用ClassWriter - 删除告诉编写器计算帧的标志。

另一种解决方案是尝试从系统加载器加载ASM。