是否有任何易于使用的CGLIB API来生成方法拦截器而不使用代理?

时间:2013-09-27 13:23:40

标签: java instrumentation cglib

我想从cglib或一些包装类中使用一个易于使用的API来实现以下类转换,这样我就可以在不使用任何代理的情况下使用该类。

@Entity
public class SomeProcess extends SomeProcessBase implements Serializable {

@ToBeTransformed
public void start() {
    //do some business logics
}

}

课程改变后,我希望它会是这样的:

@Entity
public class SomeProcess extends SomeProcessBase implements Serializable {

public void start() {
    Executor.execute(new Executable() {
        public void execute() {

          //do some business logics

        }
    });

}

}

因此,虽然我想调用someProcess.start,但我可以直接使用以下代码:

SomeProcess process = new SomeProcess();
process.start();

除了

SomeProcess process = new SomeProcess();
SomeProcess processProxy = Proxy.wrapper(process);
processProxy.start();

1 个答案:

答案 0 :(得分:0)

您可以使用javassist http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/tutorial/tutorial.html动态更改课程。像这样:

    ClassPool pool = ClassPool.getDefault();
    CtClass sp = pool.get("SomeProcess");
    for (CtMethod m : sp.getDeclaredMethods()) {
        if (m.hasAnnotation(ToBeTransformed.class)) {
            String body = // create new body 
            m.setBody(body);
        }
    }