Comment puis-je double améliorer une classe avec cglib?
Question
Voici le code:
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();
Il échoue sur la dernière assert avec
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
Je demande cela parce que je veux améliorer les entités Hibernate, mais parfois, il retourne déjà amélioré les par lui-même et mon deuxième amélioration échoue. Comment puis-je éviter cela?
La solution
Vous devez vérifier si votre classe est déjà améliorée par méthode Enhancer.isEnhanced()
.
Dans ce cas, votre 2ème amélioration devrait être appliquée à d'origine classe, pas la version améliorée déjà comme vous le faites dans le code ci-dessus. Vous pouvez toujours composer vos améliorations au sein de la mise en œuvre de MethodInterceptor.intercept()
mais vous devez le faire avec soin.
Autres conseils
Ce me fut très utile, aussi bien. Je voulais juste souligner que l'appel getSuperclass () la chaîne et la vérification Enhancer.isEnhanced () pour chaque doit localiser la superclasse appropriée.