代码之家  ›  专栏  ›  技术社区  ›  artemb

如何使用cglib对类进行双重增强?

  •  3
  • artemb  · 技术社区  · 17 年前

    代码如下:

        Patient patient = factory.createPatient();           
    
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(patient.getClass());
        enhancer.setCallback(new DefaultMethodInterceptor(patient));
        patient = (Patient) enhancer.create();
    
        assertThat(patient.getFirstName()).isNotNull();
    
    
        Enhancer enhancer2 = new Enhancer();
        enhancer2.setSuperclass(patient.getClass());
        enhancer2.setCallback(new DefaultMethodInterceptor(patient));
        patient = (Patient) enhancer2.create();
    
        assertThat(patient.getFirstName()).isNotNull();
    

    它在最后一次断言时失败

    net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
    ...
    Caused by: java.lang.reflect.InvocationTargetException
    ...
    Caused by: java.lang.ClassFormatError: Duplicate method name&signature in class file my/package/entity/Patient$$EnhancerByCGLIB$$ca1e6685$$EnhancerByCGLIB$$f52743be
    

    2 回复  |  直到 17 年前
        1
  •  6
  •   ChssPly76    17 年前

    您需要检查您的类是否已通过 Enhancer.isEnhanced() 方法

    如果是,您的第二次增强应应用于 起初的 类,而不是像您在上述代码中所做的已经增强的版本。您仍然可以在 MethodInterceptor.intercept() 但是你必须小心地去做。

        2
  •  2
  •   mbenson    16 年前