javassist.CannotCompileException: [来源错误] 没有这样的字段:$1
javassist.CannotCompileException: [source error] no such field: $1
参考:http://jboss-javassist.github.io/javassist/tutorial/tutorial2.html
method.insertBefore("{ System.out.println();}");
这条语句给我以下错误:
Exception: javassist.CannotCompileException: [source error] no such field:
javassist.CannotCompileException: [source error] no such field:
at javassist.CtBehavior.insertBefore(CtBehavior.java:774)
at javassist.CtBehavior.insertBefore(CtBehavior.java:734)
at com.here.debugHelper.DurationTransformer.transform(DurationTransformer.java:124)
at sun.instrument.TransformerManager.transform(Unknown Source)
at sun.instrument.InstrumentationImpl.transform(Unknown Source)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access0(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.here.debugHelper.TestInstrumentation.main(TestInstrumentation.java:10)
Caused by: compile error: no such field:
at javassist.compiler.TypeChecker.fieldAccess(TypeChecker.java:845)
at javassist.compiler.TypeChecker.atFieldRead(TypeChecker.java:803)
at javassist.compiler.TypeChecker.atMember(TypeChecker.java:988)
at javassist.compiler.JvstTypeChecker.atMember(JvstTypeChecker.java:66)
at javassist.compiler.ast.Member.accept(Member.java:39)
at javassist.compiler.JvstTypeChecker.atMethodArgs(JvstTypeChecker.java:221)
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:735)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:695)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:157)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:46)
at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:330)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.Javac.compileStmnt(Javac.java:567)
at javassist.CtBehavior.insertBefore(CtBehavior.java:754)
... 17 more
此外,当我使用任何参数(传递给参数)或任何局部变量而不是'$1'时,也会出现同样的错误。 问题中已对此进行了介绍,但我不太了解那里的解决方案。
有 this 其他 post 人有同样的问题但没有答案。
请帮忙。谢谢
好的,这就是我解决问题的方法。我忽略了一些错误,也学到了一些东西。我分享这个是因为我在任何地方都找不到直接解决这个问题的内容。
参考 answer and this篇文章:
insertBefore
、insertAfter
和其他此类方法 不能访问任何局部变量,但可以访问方法的方法参数 他们的名字。 no such field
如果尝试访问局部变量会发生错误。
这些方法无法访问在其中声明为检测过程的任何参数。
ctmethod.insertBefore("{int i = 4; int j = 9;}")
ctmethod.insertBefore("i = 5;");
ctMethod.insertAfter("j = 9;");
- 以上代码会给出
no such field: j(and i)
错误
insertBefore
、insertAfter
,期望在上面代码片段的第一行中完成的单个语句或单个代码块。
- 如果在
ctmethod.addcatch()
中也使用了变量,则会出现此错误 no such field
。
ctmethod.addLocalVariable()
有助于声明一个可以被 insertBefore()
等访问的变量。但是,如果您尝试使用变量,.addCatch()
仍然会给出 no such field
错误使用 .addLocalVariable()
声明
- 由于我的愚蠢错误,我得到了
no such field:
。我正在 class 中迭代许多方法,所以错误是由于其中一些方法具有 零参数 。 ,.. and $args
工作良好,如 this 文档中所述。
P.S。我会在遇到它们时添加更多提示,欢迎任何更正。
参考:http://jboss-javassist.github.io/javassist/tutorial/tutorial2.html
method.insertBefore("{ System.out.println();}");
这条语句给我以下错误:
Exception: javassist.CannotCompileException: [source error] no such field:
javassist.CannotCompileException: [source error] no such field:
at javassist.CtBehavior.insertBefore(CtBehavior.java:774)
at javassist.CtBehavior.insertBefore(CtBehavior.java:734)
at com.here.debugHelper.DurationTransformer.transform(DurationTransformer.java:124)
at sun.instrument.TransformerManager.transform(Unknown Source)
at sun.instrument.InstrumentationImpl.transform(Unknown Source)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access0(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.here.debugHelper.TestInstrumentation.main(TestInstrumentation.java:10)
Caused by: compile error: no such field:
at javassist.compiler.TypeChecker.fieldAccess(TypeChecker.java:845)
at javassist.compiler.TypeChecker.atFieldRead(TypeChecker.java:803)
at javassist.compiler.TypeChecker.atMember(TypeChecker.java:988)
at javassist.compiler.JvstTypeChecker.atMember(JvstTypeChecker.java:66)
at javassist.compiler.ast.Member.accept(Member.java:39)
at javassist.compiler.JvstTypeChecker.atMethodArgs(JvstTypeChecker.java:221)
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:735)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:695)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:157)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:46)
at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:330)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.Javac.compileStmnt(Javac.java:567)
at javassist.CtBehavior.insertBefore(CtBehavior.java:754)
... 17 more
此外,当我使用任何参数(传递给参数)或任何局部变量而不是'$1'时,也会出现同样的错误。
有 this 其他 post 人有同样的问题但没有答案。
请帮忙。谢谢
好的,这就是我解决问题的方法。我忽略了一些错误,也学到了一些东西。我分享这个是因为我在任何地方都找不到直接解决这个问题的内容。
参考
insertBefore
、insertAfter
和其他此类方法 不能访问任何局部变量,但可以访问方法的方法参数 他们的名字。 no such field
如果尝试访问局部变量会发生错误。
这些方法无法访问在其中声明为检测过程的任何参数。
ctmethod.insertBefore("{int i = 4; int j = 9;}")
ctmethod.insertBefore("i = 5;");
ctMethod.insertAfter("j = 9;");
- 以上代码会给出
no such field: j(and i)
错误 insertBefore
、insertAfter
,期望在上面代码片段的第一行中完成的单个语句或单个代码块。- 如果在
ctmethod.addcatch()
中也使用了变量,则会出现此错误no such field
。 ctmethod.addLocalVariable()
有助于声明一个可以被insertBefore()
等访问的变量。但是,如果您尝试使用变量,.addCatch()
仍然会给出no such field
错误使用.addLocalVariable()
声明
- 由于我的愚蠢错误,我得到了
no such field:
。我正在 class 中迭代许多方法,所以错误是由于其中一些方法具有 零参数 。,.. and $args
工作良好,如 this 文档中所述。
P.S。我会在遇到它们时添加更多提示,欢迎任何更正。