【问题标题】:How can I double-enhance a class with cglib?如何使用 cglib 对课程进行双重增强?
【发布时间】:2010-04-06 00:38:41
【问题描述】:

代码如下:

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

【问题讨论】:

    标签: hibernate cglib


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,成功了。我很难发现哪个类是原来的类,我最终让它工作,从类名中删除了 $$$EnhancerByCGLIB$$ 中的所有内容。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      相关资源
      最近更新 更多