下面的代码:

    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的实体,但有时它返回已增强那些和我的第二个强化失败。我怎样才能避免这种情况?

有帮助吗?

解决方案

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

如果它是你的第二增强应该应用到的原始的类,而不是已经增强版本就像你在上面的代码做。您仍然可以复合的增强MethodInterceptor.intercept()实现中,但你必须要做到这一点要小心。

其他提示

这是相当有帮助的我,也是如此。只是想指出的是,主叫getSuperclass之类()链向上和检查Enhancer.isEnhanced()为每个应找到适当的超类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top