2017-03-02 2 views
2

$ Se référant à: http://jboss-javassist.github.io/javassist/tutorial/tutorial2.htmljavassist.CannotCompileException: [Erreur source] pas de champ: 1

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

Cette déclaration me donne l'erreur suivante:

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 

De plus, la même erreur apparaît lors de l'utilisation n'importe quel paramètre (passé au paramètre) ou n'importe quelle variable locale au lieu de '$ 1'. Cela a été couvert par la question this, mais je ne comprends pas vraiment la solution.

Il y a this autre message avec la même question mais aucune réponse.

Aidez-nous s'il vous plaît. Merci

Répondre

2

Très bien, voici comment j'ai résolu le problème. Il y avait quelques erreurs que je négligeais et certaines choses que j'ai apprises. Je partage cela car je ne pouvais pas trouver le contenu traitant directement le problème n'importe où. Se référant à this réponse et this article:

Les insertBefore, insertAfter et autres méthodesne peuvent pas accéder à une variable locale, mais peut accéder à paramètre de méthode de la méthode par leur nom. no such field erreur se produit si tente d'accéder à la variable locale.

Ces méthodes ne peuvent accéder à aucun paramètre déclaré en leur sein en tant que processus d'instrumentation. ctmethod.insertBefore("{int i = 4; int j = 9;}") ctmethod.insertBefore("i = 5;"); ctMethod.insertAfter("j = 9;");

  • Le code ci-dessus donnera no such field: j(and i) erreur
  • insertBefore, insertAfter, attendez-vous une déclaration unique, ou un seul bloc de code comme cela se fait en première ligne de l'extrait de code ci-dessus.
  • Cette erreur no such field apparaît dans le cas où des variables sont également utilisées dans ctmethod.addcatch().
  • ctmethod.addLocalVariable() aide à déclarer une variable qui peut être consulté par insertBefore(), etc. Cependant, .addCatch() ne donneront no such field erreur si vous essayez d'utiliser la variable déclarée en utilisant .addLocalVariable()
  • je devenais no such field: $1 en raison de mon erreur stupide. J'allais itérer à travers un certain nombre de méthode dans une classe, donc l'erreur était due au fait que certaines de ces méthodes avaient 0 arguments. $1,$2.. and $args fonctionnent bien comme expliqué dans this doc.

P.S. Je vais ajouter d'autres conseils au fur et à mesure que je les rencontre et toutes les corrections sont les bienvenues.