2011-09-08 2 views
2

java.lang.reflect.Proxy을 사용하면 InvocationHandler을 생성자 인수로 사용하는 클래스를 만들 수 있습니다. 그러나 클래스는 프레임 워크의 어딘가에서 newInstance()을 통해 인스턴스화되며 InvocationHandler은 모든 인스턴스에 대해 동일 할 수 있습니다.인수가없는 생성자를 사용하여 프록시 클래스 만들기

원래 생성자에 InvocationHandler을 전달하는 프록시 클래스에 인수가없는 생성자를 추가 할 수 있습니까? 실제 프록시 마법은 정적 방법 Proxy.newProxyInstance(ClassLoader, Class<?>[], InvocationHandler)를 통해 액세스있어이 네이티브 코드

private static native Class defineClass0(ClassLoader loader, String name, 
        byte[] b, int off, int len); 

에서 일어나는로

답변

3

나는 그것이 모자 방법을 작동하지 않습니다 두려워. 이 메서드는 차례로 제공된 InvocationHandler 매개 변수로 생성 된 클래스의 생성자를 호출합니다.

따라서 newInstance() 전화에서 프록시를 반환 할 방법이 없습니다. 가장 가까운 값은 InvocationHandlernewInstance()으로 인스턴스화하고 정적 팩터 리 방법으로 전달하는 것입니다.

당신은 그 모든 것을 한 걸음 더 나아가서 목표 인터페이스를 구현하는 클래스를 가지며 팩토리 메소드를 통해 프록시 필드를 구성하고 모든 인터페이스 메소드를 프록시에 위임 할 수 있습니다. 그러나 그것은 프록시 주위의 프록시 일 것이고, 나는 그 점을 정말로 보지 못합니다.

+0

defineClass0에 대한 원시 코드를 체크 아웃 할 수있는 방법이 있습니까? – RawAliasCoder

+0

@RawAliasCoder 그 코드는 JRE와 특정 플랫폼이 될 것이므로, 내가 선택한 경로가 아닌, 코드를 변경하는 것이 좋지 않은 이유가 필요합니다. – MichaelRom

관련 문제