- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
引用: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
和其他此类方法 不能访问任何局部变量,但可以访问方法的方法参数 以他们的名字命名。 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()
如果您尝试使用使用 .addLocalVariable()
no such field
错误
no such field: $1
。我正在迭代一个类中的多个方法,所以错误是由于其中一些方法具有零参数。 $1、$2.. 和 $args
工作正常,如 this 中所述文档。附言我会在遇到这些提示时添加更多提示,欢迎任何更正。
关于javassist.CannotCompileException : [source error] no such field: $1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42551039/
我正在尝试通过javassist调用java.util.Arrays.asList(..)。但是得到下面的异常。 javassist.CannotCompileException: [source e
嗯尝试检测一种方法来完成以下任务。 任务 - 创建映射并将值插入到映射中添加 System.out.println 行不会导致任何异常。但是,当我添加行来创建 map 时,由于缺少;,它会抛出cann
我现在正在尝试在我的网络应用程序中编写一些字节码操作,当我尝试将代码注入(inject)到我的方法中时,它总是会抛出错误 javassist.CannotCompileException: [sour
我正在尝试使用 javassist 来将 System.out.println 添加到现有类的方法中,使用此代码 - .... ClassPool pool = new ClassPool();
我正在使用 Java 工具和 Javassist将 print 语句插入方法中。这大多数情况下都不会出现错误,但对于某些类方法(例如 java.util.TimeZone.getSystemTimeZ
我正在尝试使用字节码检测添加 try catch block 。 基本上,我有一个“Lion”类。我想在 try block 中捕获其方法“stayLion()”之一的全部内容并给出相应的 catch
引用:http://jboss-javassist.github.io/javassist/tutorial/tutorial2.html method.insertBefore("{ System.
我正在执行以下操作并获得奖励: Exception in thread "main" java.lang.NoClassDefFoundError: javassist/CannotCompi
我正在使用 javassist 来更改方法体。当该方法在应用程序中定义时我可以做到这一点。但是,当我想更改应用程序使用的 jar 文件中定义的方法时,我会收到以下运行时错误: javassist.Ca
我是一名优秀的程序员,十分优秀!