在春季使用cglib的嵌套代理 原始班级创建两个代理预期结果如下(打印)但是我收到以下异常(在创建第二个代理时)现实世界场景

序言:我想创建一个现有代理的代理(在春季使用cglib软件包) ,例如当我调用原始方法类时,两个代理的两个方法都首先被调用。有什么意义吗?或者有可能吗?

问题:创建第二个enhancer时,我得到了 java.lang.ClassFormatError-->Duplicate method name "newInstance" with signature "例外。


示例代码如下

原始班级

public class OriginalClass {

    public void print(){
        System.out.println("MAIN METHOD");
    }

}

创建两个代理

public class Main {

    public static void main(String[] args) {

        //Create First Proxy
        Enhancer firstEnhancer= new Enhancer();
        firstEnhancer.setSuperclass(OriginalClass.class);
        firstEnhancer.setCallback((MethodInterceptor) (o,method,objects,methodProxy) -> {
            System.out.println("METHOD INTERCEPTOR AT FIRST Proxy");
            return methodProxy.invokeSuper(o,objects);
        });
        OriginalClass firstProxy = (OriginalClass) firstEnhancer.create();

        //Create Second Proxy
        Enhancer secondEnhancer= new Enhancer();
        secondEnhancer.setSuperclass(firstProxy.getclass());
        secondEnhancer.setCallback((MethodInterceptor) (o,methodProxy) -> {
            System.out.println("METHOD INTERCEPTOR AT SECOND Proxy");
            return methodProxy.invokeSuper(o,objects);
        });

        //Getting Exception on this line
        OriginalClass secondProxy = (OriginalClass) secondEnhancer.create();

        //Call 
        secondProxy.print();
    }
}

预期结果如下(打印)

METHOD INTERCEPTOR AT SECOND Proxy
METHOD INTERCEPTOR AT FIRST Proxy
MAIN METHOD

但是我收到以下异常(在创建第二个代理时)

Caused by: java.lang.ClassFormatError: Duplicate method name "newInstance" with signature "([Lorg.springframework.cglib.proxy.Callback;)Ljava.lang.Object;" in class file com/test/OriginalClass$$EnhancerByCGLIB$$37b306ed$$EnhancerByCGLIB$$15133919

现实世界场景

我想使用BeanPostProcessorscglib在到Spring代理的所有bean上包装一个代理。例如,我想在所有@transactional方法上包装一个代理(在事务前后记录日志)。

更新:我更喜欢创建代理,而不是AOP。(AOP本身是代理)

dasnan 回答:在春季使用cglib的嵌套代理 原始班级创建两个代理预期结果如下(打印)但是我收到以下异常(在创建第二个代理时)现实世界场景

我发现了有效的解决方案,它在第二个增强器中使用methodProxy.invoke()代替methodProxy.invokeSuper()时有效,并且firstProxy也需要传递给调用而不是{{ 1}}对象,并将superClass设置为原始对象,但没有newInstance方法:

o

结果:

public class Test {
     public static void main(String[] args) {

            //Create First Proxy
            Enhancer firstEnhancer= new Enhancer();
            firstEnhancer.setSuperclass(OriginalClass.class);
            firstEnhancer.setCallback((MethodInterceptor) (o,method,objects,methodProxy) -> {
                System.out.println("METHOD INTERCEPTOR AT FIRST PROXY");
                return methodProxy.invokeSuper(o,objects);
            });
            OriginalClass firstProxy = (OriginalClass) firstEnhancer.create();

            //Create Second Proxy
            Enhancer secondEnhancer= new Enhancer();
            secondEnhancer.setSuperclass(firstProxy.getClass().getSuperclass());
            // secondEnhancer.setSuperclass(OriginalClass.class);
            secondEnhancer.setCallback((MethodInterceptor) (o,methodProxy) -> {
                System.out.println("METHOD INTERCEPTOR AT SECOND PROXY");
                return methodProxy.invoke(firstProxy,objects);
            });

            //Getting Exception on this line
            OriginalClass secondProxy = (OriginalClass) secondEnhancer.create();

            //Call 
            secondProxy.print();
        }
}
本文链接:https://www.f2er.com/2644437.html

大家都在问