Как я могу дважды улучшить класс с помощью cglib?
Вопрос
Вот код:
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, но иногда он сам возвращает уже улучшенные объекты, и мое второе улучшение не удается.Как мне этого избежать?
Решение
Вам нужно проверить, улучшен ли уже ваш класс с помощью Enhancer.isEnhanced()
метод.
Если это так, ваше второе улучшение должно быть применено к оригинальный class, а не уже расширенную версию, как в приведенном выше коде.Вы все равно можете объединить свои улучшения в MethodInterceptor.intercept()
реализацию, но делать это нужно осторожно.
Другие советы
Для меня это тоже было весьма полезно.Просто хотел отметить, что вызов getSuperclass() вверх по цепочке и проверка Enhancer.isEnhanced() для каждого из них должны найти правильный суперкласс.