如何用cglib双重增强类?

art*_*emb 3 hibernate 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();
Run Code Online (Sandbox Code Playgroud)

它失败了最后一个断言

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
Run Code Online (Sandbox Code Playgroud)

我问这个是因为我想增强Hibernate的实体,但有时候它会自己返回已经增强的实体,而我的第二个增强失败了.我怎么能避免这个?

Chs*_*y76 6

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

如果是,您的第二个增强应该应用于原始类,而不是像上面代码中那样已经增强的版本.您仍然可以在MethodInterceptor.intercept()实施过程中增强您的增强功能,但您必须小心谨慎.