Javassist-为什么在执行过程中被拦截后,我无法替换方法主体?

时间:2018-07-15 20:07:58

标签: methods call instrumentation javassist bytecode-manipulation

我正在尝试使用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.");
    }
}

我的问题类加载是否相关?

0 个答案:

没有答案