我正在尝试使用javassist,以便使用此代码将System.out.println添加到现有类的方法中-
....
ClassPool pool = new ClassPool();
try {
pool.appendClassPath(targetPath);
CtClass cc = pool.get("model.Ball");
CtMethod[] cm = cc.getDeclaredMethods();
for (CtMethod m : cm) {
String temp = m.getName();
m.insertBefore("{ System.out.println(\"Executed Method \" + temp); }");
}
但是我一直收到此Stacktrace:
javassist.CannotCompileException: [source error] no such class: System.out
at javassist.CtBehavior.insertBefore(CtBehavior.java:774)
at javassist.CtBehavior.insertBefore(CtBehavior.java:734)
at reverseEngineer.dynamicparser.DynamicAnalyser.methodInformation(DynamicAnalyser.java:77)
at reverseEngineer.dynamicparser.DynamicAnalyser.loadClass(DynamicAnalyser.java:61)
at reverseEngineer.ModelParser.parseDynamic(ModelParser.java:77)
at reverseEngineer.ModelParser.parseTarget(ModelParser.java:44)
at reverseEngineer.Driver.main(Driver.java:30)
Caused by: compile error: no such class: System.out
at javassist.compiler.MemberResolver.searchImports(MemberResolver.java:468)
at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:412)
at javassist.compiler.MemberResolver.lookupClassByJvmName(MemberResolver.java:319)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:678)
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:569)
at javassist.CtBehavior.insertBefore(CtBehavior.java:754)
... 6 more
我试过用
m.insertBefore("{ int x = 1; }");
哪个工作得很好-将System.out.println()更改为System.getcurrenttimemillis()只会在没有“此类:系统”的情况下返回相同的堆栈跟踪
最佳答案
您可以像这样创建ClassPool:
ClassPool pool = new ClassPool();
这将创建一个空的ClassPool,甚至不会创建rt.jar中的默认Java类。因此,没有定义System类,并且编译失败。
通过使用:
ClassPool pool = new ClassPool(true);
您将获得一个ClassPool,其中包含来自classPath的内容和已添加的系统jar。找到系统类并进行编译。