2017-03-02 7 views
2

参照すると: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です。

助けてください。ありがとうございます

答えて

2

これは私が問題を回避する方法です。私が見過ごしていたミスや、私が学んだことはほとんどありませんでした。問題をどこにでも直接取り上げているコンテンツを見つけることができなかったので、私はこれを共有しています。 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)エラー
  • insertBefore
  • insertAfter与える上記のコードの最初の行で行われるように単一の文、またはコードの単一のブロックを期待します。
  • このエラーno such fieldは、ctmethod.addcatch()でも変数が使用されている場合に表示されます。
  • ctmethod.addLocalVariable()変数を使用しようとinsertBefore()などによってアクセスできる変数を宣言するにはしかし、.addCatch()はまだno such fieldエラーを与えることができますが、私が原因私の愚かな過ちにno such field: $1を得ていた.addLocalVariable()
  • を使用して宣言しました。私はクラス内でいくつかのメソッドを反復しようとしていたので、そのエラーのいくつかはの引数がゼロのだったためです。 $1,$2.. and $argsは、thisdocで説明されているようにうまく機能します。

P.S.私はそれらを遭遇し、訂正が歓迎されるように私はさらなるヒントを追加します。