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()
방법.
그렇다면 2차 개선 사항을 다음에 적용해야 합니다. 원래의 위 코드에서와 같이 이미 향상된 버전이 아닙니다.당신은 여전히 내에서 개선 사항을 복합화할 수 있습니다 MethodInterceptor.intercept()
구현하지만 주의해서 수행해야 합니다.
다른 팁
이것은 나에게도 도움이되었습니다. getSuperClass () 호출을 체인을 위로 올리고 Enhancer.isenhanced ()를 확인하면 각각의 슈퍼 클래스를 찾아야한다고 지적하고 싶었습니다.
제휴하지 않습니다 StackOverflow