¿Cómo puedo mejorar doble una clase con cglib?
Pregunta
Aquí está el código:
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();
Se produce un error en la última aserción con
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
Lo pregunto porque quiero mejorar entidades de Hibernate, pero a veces ya Devuelve los aumenté por sí mismo y no logra mi segunda mejora. ¿Cómo puedo evitar esto?
Solución
Es necesario comprobar si su clase ya se ve reforzada a través del método Enhancer.isEnhanced()
.
Si es así, su segunda mejora se debe aplicar a ORIGINAL clase, no la versión mejorada ya como lo hace en el código de seguridad. Todavía se puede agravar sus mejoras dentro de la aplicación MethodInterceptor.intercept()
pero hay que hacerlo con cuidado.
Otros consejos
Esto fue bastante útil para mí, también. Sólo quería señalar que llamar getSuperclass () en la cadena y comprobar Enhancer.isEnhanced () para cada uno debe localizar la superclase adecuada.