以下是代码:
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的实体,但有时候它会自己返回增强的实体,而我的第二个增强功能失败了。我怎么能避免这个?
答案 0 :(得分:6)
您需要检查您的课程是否已通过Enhancer.isEnhanced()
方法进行了增强。
如果是,您的第二个增强功能应该应用于原始类,而不是像上面代码中那样已经增强的版本。您仍然可以在MethodInterceptor.intercept()
实施中加强您的增强功能,但您必须小心谨慎。
答案 1 :(得分:2)
这对我也很有帮助。只是想指出在链中调用getSuperclass()并检查每个的Enhancer.isEnhanced()应该找到合适的超类。