方法代码太大!使用 ASM 的异常

Ash*_*yad 5 java java-bytecode-asm

我正在使用 ASM 代码迭代一个类而不操作任何字节代码。但是当我将 classwriter 转换为 bytearray(cw.toByteArray()) 时,我得到的方法代码太大了!例外。

谁能告诉我这是什么时候发生的..

我的代码片段如下---

InputStream in= new FileInputStream("D:/AshiqWorkspace/RandD/ByteCodeStudy/temp/GameManager.class");
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS|ClassWriter.COMPUTE_FRAMES);
ClassVisitor ca = null;
ca = new CustomClassNode(cw);  // CustomClassNode class extends ClassNode implements Opcodes
cr.accept(ca, 0);   
File outputDir=new File("D:/AshiqWorkspace/RandD/ByteCodeStudy/out");
outputDir.mkdirs();
DataOutputStream dout=new DataOutputStream(new FileOutputStream(new File(outputDir,"GameManager.class")));
dout.write(cw.toByteArray()); // on this line "method code too large exception coming"
Run Code Online (Sandbox Code Playgroud)

vij*_*jay 6

Java 中的某些方法已经相当大,对它们进行检测会进一步增加它们的大小,从而导致您观察到的异常。如果我没记错的话,JVM 对任何方法的大小强加 65535 字节的大小。

试图克服这个问题的一个解决方案/项目着眼于拆分有问题的方法...这是其 git 存储库的链接: https: //github.com/ThexXTURBOXx/asm-method-size。它基于 ASM 本身。希望这可以帮助。

  • 现在发生在 JDK 的 JLink 中,叹息没有解决方法。错误:jdk.internal.org.objectweb.asm.MethodTooLargeException:方法太大:jdk/internal/module/SystemModules$all.moduleDescriptors ()[Ljava/lang/module/ModuleDescriptor; (2认同)
  • 供将来参考:我已经恢复了存储库并将其从 Mercurial 转换为 Git。您可以在这里找到恢复的存储库:https://github.com/ThexXTURBOXx/asm-method-size (2认同)