Como posso duplo melhorar uma classe com cglib?
Pergunta
Aqui está o 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();
Ele falha no último assert com
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
Pergunto isso porque eu quero melhorar entidades do Hibernate, mas às vezes ele já retorna reforçada queridos por si só e meu segundo aprimoramento falhar. Como posso evitar isso?
Solução
Você precisa verificar se sua classe já é reforçada através do método Enhancer.isEnhanced()
.
Se for, o seu segundo reforço deve ser aplicada a ORIGINAL classe, não a versão já avançado, como você faz no código acima. Você ainda pode agravar os seus acessórios dentro implementação MethodInterceptor.intercept()
mas você tem que fazer isso com cuidado.
Outras dicas
Este foi bastante útil para mim, também. Só queria salientar que chamar getSuperclass () até a cadeia e verificar Enhancer.isEnhanced () para cada deve localizar a superclasse adequada.