问题描述
在使用 IBM 时,我收到以下错误。它在 Oracle 中运行良好。我的课程是用 Oracle 而不是 IBM 编译的。
我在通过反射调用类时收到此错误。通过 main 方法运行它可以正常工作。
Class aClass=ObfuscationUtility.class;
Method[] methods = aClass.getDeclaredMethods();
for (Method method : methods) {
if (method.getName().equals(deobfuscated_method)) {
method.setAccessible(true);
try {
decryptedText = (String) method.invoke(aClass,encryptedText);
....
任何建议我可能会犯什么错误。
Exception in thread "main" java.lang.VerifyError: JVMVRFY010 multiple jsrs use single return; class=com/ObfuscationUtility,method=<clinit>()V,pc=65
Exception Details:
Location:
com/ObfuscationUtility.<clinit>()V @65: JBjsr
Reason:
Error exists in the bytecode.
Exception Handler Table:
bci [322,333] => handler: 1146
bci [1147,1157] => handler: 692
at java.lang.classLoader.defineClassImpl(Native Method)
at java.lang.classLoader.defineClassInternal(ClassLoader.java:396)
at java.lang.classLoader.defineClass(ClassLoader.java:357)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:154)
at java.net.urlclassloader.defineClass(urlclassloader.java:730)
at java.net.urlclassloader.access$400(urlclassloader.java:96)
at java.net.urlclassloader$ClassFinder.run(urlclassloader.java:1187)
at java.security.AccessController.doPrivileged(AccessController.java:774)
at java.net.urlclassloader.findClass(urlclassloader.java:605)
at java.lang.classLoader.loadClassHelper(ClassLoader.java:942)
at java.lang.classLoader.loadClass(ClassLoader.java:887)
at java.lang.classLoader.loadClass(ClassLoader.java:870)
解决方法
内部使用ASM库来执行类字节码 操纵。 Java 7 的一个要求是它包含一个 StackMap 表以协助类验证。 使用中的 ASM 版本包含一个缺陷,导致 修改了类以具有不正确的 StackMap 表,这 加载类时会导致 java.lang.VerifyError 发生。 当类中的方法使用 多维数组。
问题结论 ASM 库已更新,修复正确 为使用的方法生成 StackMap 多维数组。