我必須在運行時修改以下類,以在每個方法的末尾打印實例變量'count'的值。使用javasssist打印實例變量
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
你能pointout在我的代碼錯誤了嗎?
我想像(只是猜測)該類已經加載,所以對.class文件的更改不會反映在當前JVM的運行時。您可以嘗試重新加載班級,例如這裏:http://stackoverflow.com/a/3971771/281108 –
hmm ....看起來很複雜。我嘗試了加載類的不同方式。 \t \t Class testClass = Loader.getSystemClassLoader()。loadClass(「test.hib.javaassist.JavaAssistTest」); \t \t JavaAssistTest test =(JavaAssistTest)testClass.newInstance();但結果沒有變化! – Renjith
我很確定,如果它已經加載,將不會重新加載類。 –