3

这是代码:

    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 的实体,但有时它会自行返回已经增强的实体,而我的第二次增强失败。我怎样才能避免这种情况?

4

2 回答 2

6

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

如果是这样,您的第二次增强应该应用于原始类,而不是像上面代码中那样已经增强的版本。您仍然可以在MethodInterceptor.intercept()实现中复合您的增强功能,但您必须谨慎行事。

于 2009-08-14T18:46:30.907 回答
2

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

于 2010-04-05T16:38:41.290 回答