我正在尝试使用instrument
替换主类中声明的方法。这段代码将拦截执行过程中的所有方法调用,但不会替换特定方法的方法主体(在我的情况下为change
)
BeanMain.java
package application;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;
import javassist.expr.ExprEditor;
import javassist.expr.MethodCall;
public class BeanMain {
private Bean bean;
public BeanMain(){
bean = new Bean("old_a", "old_b");
}
public void print(){
System.out.format("\n%-25s %5s %5s\n", "[BeanMain]", bean.getA(), bean.getB());
}
public void change(String pre){
bean.setParam(pre+"A", pre+"B");
}
public static void main(String[] args) throws NotFoundException, CannotCompileException {
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get("application.BeanMain");
ctClass.instrument(new ExprEditor(){
@Override
public void edit(MethodCall m) throws CannotCompileException {
System.out.println(m.getMethodName());
if(m.getMethodName().equals("change"))
m.replace("{System.out.println(\"$1\"); $_ = $proceed($$);}");
}
});
BeanMain inst = new BeanMain();
inst.print();
inst.change("new_");
inst.print();
}
}
Bean.java
package application;
public class Bean {
private String a;
private String b;
public Bean(){}
public Bean(String a, String b) {
this.a = a;
this.b = b;
}
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public void setParam(String a, String b){
this.a = a;
this.b = b;
}
public void doSomething(){
System.out.println("Doing something.");
}
}
我的问题类加载是否相关?