Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有任何易于使用的CGLIB API可以在不使用代理的情况下生成方法拦截器?_Java_Instrumentation_Cglib - Fatal编程技术网

Java 是否有任何易于使用的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

我想要一个来自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

        }
    });

}

}
    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