2009-08-14 72 views
3

下面的代码:如何使用cglib双重增强类?

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 

,因为我要增强Hibernate的实体我问这个,但有时它返回由自己和我的第二个已增强的人增强失败。我怎样才能避免这种情况?

回答

6

您需要检查您的课程是否已通过Enhancer.isEnhanced()方法增强。

如果是这样,你的第二个增强应该应用于原始类,而不是像你在上面的代码中那样已经增强的版本。您仍然可以在MethodInterceptor.intercept()实施中将复合增强功能加以组合,但您必须小心操作。

+0

谢谢你,这个伎俩。我很难发现哪一个类是原来的类,我最终从它的名字中切割出了$$$ EnhancerByCGLIB $$中的所有内容。 – artemb 2009-08-17 11:43:41

2

这对我也很有帮助。只是想指出,调用getSuperclass()链并检查Enhancer.isEnhanced()是否应找到正确的超类。