Java 是否有任何易于使用的CGLIB API可以在不使用代理的情况下生成方法拦截器?
我想要一个来自cglib或一些包装类的易于使用的API来实现下面的类转换,以便在使用该类时不涉及任何代理Java 是否有任何易于使用的CGLIB API可以在不使用代理的情况下生成方法拦截器?,java,instrumentation,cglib,Java,Instrumentation,Cglib,我想要一个来自cglib或一些包装类的易于使用的API来实现下面的类转换,以便在使用该类时不涉及任何代理 @Entity public class SomeProcess extends SomeProcessBase implements Serializable { @ToBeTransformed public void start() { //do some business logics } } 班级改造后,我希望是这样的: @Entity public class So
@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
}
});
}
}
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);
}
}
因此,当我想调用someProcess.start时,我可以直接使用以下代码:
SomeProcess process = new SomeProcess();
process.start();
除
SomeProcess process = new SomeProcess();
SomeProcess processProxy = Proxy.wrapper(process);
processProxy.start();
您可以使用javassist动态更改类。大概是这样的:
@Entity
public class SomeProcess extends SomeProcessBase implements Serializable {
public void start() {
Executor.execute(new Executable() {
public void execute() {
//do some business logics
}
});
}
}
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);
}
}
谢谢但我希望旧的身体被包裹起来,旧的身体仍然有用。我理解设置一个封闭类并不是那么容易,因为一旦有了参数引用,它们就应该被复制到内部类。我不知道如何使用javassist实现这一点。根据您的回答,新的问题应该是:如何使用嵌套为内部类方法的旧主体创建新主体。您可以重命名start->start0,创建新的start并从中调用start0