Как я могу дважды улучшить класс с помощью cglib?

StackOverflow https://stackoverflow.com/questions/1277771

  •  16-09-2019
  •  | 
  •  

Вопрос

Вот код:

    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() для каждого из них должны найти правильный суперкласс.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top