我必须在运行时修改以下类,以在每个方法末尾打印实例变量“count”的值。
package test.hib.javaassist;
import java.io.IOException;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
public class JavaAssistTest {
int count;
public void doSomething1(){
count++;
}
public void doSomething2(){
count++;
}
public void doSomething3(){
count++;
}
public void doSomething4(){
count++;
}
}
以下是主类,我尝试在 javaassist 的帮助下更改字节码。
package test.hib.javaassist;
import java.io.IOException;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
public class Main {
public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("test.hib.javaassist.JavaAssistTest");
CtMethod[] methods = cc.getDeclaredMethods();
for(CtMethod method : methods){
if(! (method.getName().equals("main"))){
method.insertAfter("{System.out.println(count);}");
//method.insertAfter("System.out.println($type);");
}
}
cc.writeFile();
System.out.println("Completed editting");
JavaAssistTest test = new JavaAssistTest();
test.doSomething1();
test.doSomething2();
test.doSomething3();
test.doSomething4();
System.out.println("Finished");
}
}
目前正在打印
Completed editting
Finished
我想要打印
Completed editting
1
2
3
4
Finished
你能指出我代码中的错误吗?
最佳答案
Javassist API 在这里有点令人困惑。看一下 writeFile
的实现。它是 writeFile(".")
的快捷方式,它将类保存在程序目录中,而不是类路径中。您希望它覆盖原始类文件,但此方法不执行此操作。您的系统类加载器将无法找到更新的类文件。
您可以使用writeFile(String)
手动将类文件保存在正确的位置,或者通过调用cc.toClass()
强制加载修改后的类。在类加载器手动查找修改后的类之前强制加载它。
关于java - 使用 javasssist 打印实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40826339/