使用javassist可以實(shí)現直接修改class文件中的方法,javassist是jboss的一個(gè)子項目,其主要的優(yōu)點(diǎn),在于簡(jiǎn)單,而且快速。直接使用java編碼的形式,而不需要了解虛擬機指令,就能動(dòng)態(tài)改變類(lèi)的結構,或者動(dòng)態(tài)生成類(lèi)。
下面是例子:
1.要修改的class文件的代碼,當然正常情況下你是看不到的
packagecom.ms.xbox.halo.reach;
public class For_test {
public final boolean output(){
return false;
}
public static voidmain(String[] args) {
// TODO Auto-generated methodstub
String strAaa="輸出結果";
System.out.println(strAaa);
}
}
2.隨便建一個(gè)java工程,引入javassist的jar包,編譯環(huán)境我用的1.4版本jdk,修改代碼如下
import javassist.*;
public class test {
public static void main(String args[]) throwsException{
ClassPool cp= ClassPool.getDefault();
//獲得類(lèi)文件名
CtClass cc =cp.get("com.ms.xbox.halo.reach.For_test");
//獲得要修改的方法名
CtMethod m =cc.getDeclaredMethod("output");
//這里是將返回結果改成true
m.insertBefore("return true;");
cc.writeFile();
}
}
3.執行 java test,用反編譯工具(這里用的是jd-gui),再去看看文件夾com\ms\xbox\halo\reach下的類(lèi)For_test,方法output已經(jīng)被修改了
packagecom.ms.xbox.halo.reach;
public class For_test {
public final boolean output(){
returntrue;return false;
}
public static voidmain(String[] args) {
// TODO Auto-generated methodstub
String strAaa="輸出結果";
System.out.println(strAaa);
}
}
當然javassist還有很多的功能,可以修改類(lèi)中方法的屬性,新增加方法,修改已有方法的程序體,上面只是一個(gè)很簡(jiǎn)單的例子.
感謝能看完全文,javassistjar包的下載地址:
http://cdnetworks-kr-1.dl.sourceforge.net/project/jboss/Javassist/3.11.0.GA/javassist-3.11.GA.zip