Jvm computeFrames选项不支持在JSR/RET失败的方法代码中添加trycatch

Jvm computeFrames选项不支持在JSR/RET失败的方法代码中添加trycatch,jvm,java-bytecode-asm,Jvm,Java Bytecode Asm,我正在编写一个Java代理,它应该是附加的 到正在运行的JVM。在那个正在运行的JVM上,已经加载了一个类,并且代理希望插入该类的方法 代理使用ASM框架在要插入指令的方法内容中添加try/catch块 下面是我为添加try/catch块而编写的代码: public void visitCode() { if (mMethodName.equals("test")) { mv.visitLabel(startFinally); super.visit

我正在编写一个Java代理,它应该是附加的 到正在运行的JVM。在那个正在运行的JVM上,已经加载了一个类,并且代理希望插入该类的方法

代理使用ASM框架在要插入指令的方法内容中添加
try
/
catch

下面是我为添加
try
/
catch
块而编写的代码:

public void visitCode() {
  if (mMethodName.equals("test")) {       
    mv.visitLabel(startFinally);      
    super.visitCode();
  }  
}
public void visitMaxs(int maxStack, int maxLocals) {
   Label endFinally = new Label();
   mv.visitTryCatchBlock(startFinally,endFinally,endFinally,
    "java/lang/Exception");
   mv.visitLabel(endFinally);
   mv.visitVarInsn(ASTORE, 1);
   mv.visitVarInsn(ALOAD, 1);
   mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception",
    "printStackTrace", "()V"););
}
我正在
ClassWriter
中使用
ClassWriter.COMPUTE\u FRAMES
,但我得到一个错误:

java.lang.RuntimeException: JSR/RET are not supported with computeFrames option
  at com.bea.objectweb.asm.Frame.a(Unknown Source)
  at com.bea.objectweb.asm.MethodWriter.visitJumpInsn(Unknown Source)
  at com.bea.objectweb.asm.ClassReader.a(Unknown Source)

我很难理解这里方法出口点的相关性。因为只有一个方法入口点,所以在唯一的
onMethodEnter()
调用中只添加了一个
try
块。为什么要添加多个
catch
块?这些
catch
块如何与方法exit而不是
try
块关联?我只想添加一个catch块,但我想添加到方法代码的末尾。当调用onMEthodExit(int操作码)时,我正在执行的catch块。现在这个onMethodExit()将被多次调用,我不知道该调用是最后一次调用。所以我的OnMeOxDebug()的实现在返回的时候在方法中间添加了catch块,所以为什么不使用<代码> VisualTead()<代码>?这样做,它现在正在工作。看来你没有抓住要点。如果类版本为
49
,则可以省略
COMPUTE\u FRAMES
,因为不需要计算它们。这些框架是版本
50
的新功能。旧版本不知道它们,因此不需要它们。您只需注意保留转换类的旧版本号。