我正在尝试使用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。找到系统类并进行编译。

08-03 22:15
查看更多