2014-05-23 14 views
1

인터페이스 대신 클래스 용 프록시를 만들고 싶습니다. 이 목적을 위해 cglib 또는 Javassist를 사용하는 방법에 대한 대답이 있지만 (예 : https://stackoverflow.com/a/4449998/) 프록시에 관심이있는 클래스에 인수가없는 생성자가 없으므로 주름이 생겨서 Enhancer.create()이 예외를 throw합니다. Javassist ProxyFactory javadoc을 보면 생성자 인수도 필요합니다.인수가없는 생성자가없는 클래스에 대한 동적 프록시 만들기

명백한 해결 방법은 리플렉션 (reflection)과 nulls/0/등의 배열을 전달하여 생성자 인수 유형을 찾는 것입니다. 그러나 생성자가 예외를 throw하는 경우에는 작동하지 않습니다.

다른 라이브러리를 사용하는 것이 더 나은 대안이 있습니까?

답변

4

Objenesis은 여러 JVM 특정 클래스의 래퍼로 구현할 수 있습니다. 결과적으로,이 라이브러리를 사용하면 생성자를 호출하지 않고 클래스의 인스턴스를 작성할 수 있습니다. 그러나 Objenesis를 사용하면 잠재적으로 안전하지 않을 수 있습니다. JVM 관련 클래스가 이식 가능하거나 표준화되지 않았기 때문입니다. 이런 이유로, Spring이나 Hibernate와 같은 라이브러리는 인수없는 생성자를 필요로한다.

뻔뻔스러운 플러그 : 일반적으로 아직 개발중인 javassist/cglib 대안을 찾으려면 내 라이브러리 bytebuddy.net을보십시오.

+0

아, 그래서 cglib/javassist/ByteBuddy를 사용하여 프록시 클래스를 만든 다음 Objenesis로 인스턴스를 생성 하시겠습니까? –

+0

예. 그것이 당신이하는 일입니다. –