编程语言
首页 > 编程语言> > javassist.CannotCompileException:[源错误]没有这样的字段:$1

javassist.CannotCompileException:[源错误]没有这样的字段:$1

作者:互联网

参考:http://jboss-javassist.github.io/javassist/tutorial/tutorial2.html

method.insertBefore("{ System.out.println($1);}");

此语句给我以下错误:

Exception: javassist.CannotCompileException: [source error] no such field: $1
javassist.CannotCompileException: [source error] no such field: $1
        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.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.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: $1
        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问题中进行了介绍,但是我真的不明白那里的解决方案.

还有this个其他帖子,同样的问题,但没有答案.

请帮忙.谢谢

解决方法:

好的,这就是我解决该问题的方法.我忽略了一些错误,也学到了一些东西.我之所以分享此内容,是因为我无法在任何地方找到直接解决该问题的内容.
参考this答案和this文章:

insertBefore,insertAfter和其他此类方法无法访问任何局部变量,但可以通过其名称访问方法的方法参数.如果尝试访问局部变量,则不会发生此类字段错误.

这些方法无法访问在其中声明的作为检测过程的任何参数.
ctmethod.insertBefore(“ {int i = 4; int j = 9;}”)
ctmethod.insertBefore(“ i = 5;”);
ctMethod.insertAfter(“ j = 9;”);

>上面的代码不会给出这样的字段:j(和i)错误
> insertBefore,insertAfter,期望有一个语句或一个代码块,如上述代码片段的第一行所示.
>如果在ctmethod.addcatch()中也使用了变量,则不会出现此错误,不会出现此字段.
> ctmethod.addLocalVariable()有助于声明可以由insertBefore()等访问的变量.但是,如果尝试使用通过.addLocalVariable()声明的变量,.addCatch()仍不会给出此类字段错误.
>我没有得到这样的字段:$1由于我的愚蠢错误.我要遍历一个类中的许多方法,因此出现错误是由于其中一些方法的参数为零. $1,$2 ..和$args运作良好,如this文档中所述.

附言当我遇到这些提示时,我将添加更多提示,欢迎进行任何更正.

标签:javassist,code-injection,instrumentation,java,bytecode
来源: https://codeday.me/bug/20191111/2021363.html