【问题标题】:javassist.CannotCompileException: [source error] no such field: $1javassist.CannotCompileException:[源错误]没有这样的字段:$ 1
【发布时间】:2017-03-02 09:08:46
【问题描述】:

参考: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 其他帖子有同样的问题但没有答案。

请帮忙。谢谢

【问题讨论】:

    标签: java code-injection bytecode instrumentation javassist


    【解决方案1】:

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

    insertBeforeinsertAfter其他此类方法 不能访问任何局部变量,但可以通过其名称访问方法的方法参数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)错误
    • insertBeforeinsertAfter,期望单个语句或单个代码块,如上述代码 sn-p 的第一行中所做的那样。
    • 如果在ctmethod.addcatch() 中也使用变量,则会出现此错误no such field
    • ctmethod.addLocalVariable() 有助于声明一个可由insertBefore() 等访问的变量。但是,如果您尝试使用使用.addLocalVariable() 声明的变量,.addCatch() 仍然会给出no such field 错误
    • 由于我的愚蠢错误,我收到了no such field: $1。我正在遍历一个类中的多个方法,因此错误是由于其中一些方法具有零参数$1,$2.. and $args 工作良好,如 this 文档中所述。

    附:我会在遇到它们时添加更多提示,欢迎任何更正。

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 2012-06-13
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2015-09-11
      • 2021-06-20
      相关资源
      最近更新 更多