2010-12-10 5 views
5

동적 프록시의 래핑을 취소하여 원본 개체를 검색하는 최선의 방법은 무엇입니까? 동적 프록시를 사용하여 생성되었습니다 java.lang.reflect.Proxy.newProxyInstance()원본 프록시를 동적 프록시에서 푸는 방법

감사합니다.

+0

당신이 그것을 만든 방법에 따라 달라집니다 더 좋은 방법은 당신이하는 게터와 익명이 아닌 핸들러 클래스를 만드는 것입니다. 어떤 도서관? JDK 프록시? 또는 CGLIB/Javassist? – Bozho

+0

@ 보 소 : 더 정확한 질문을 업데이트했습니다. – MRalwasser

+0

원래 개체가 있다고 가정합니다. 'InvocationHandler'가'newProxyInstance()'로 보내지는 것은 무엇입니까? –

답변

8

각 프록시에는 InvocationHandler이 연결되어 있습니다. InvocationHandler 만 인 경우 어떤 개체 ()가 프록시의 기초가되는지 알 수 있습니다. 프록시 생성을 제어하면 추가 기능 (예 : 기본 객체를 공개 할 수 있음)을 갖게 될 InvocationHandler을 제공 할 수 있습니다. 그렇지 않으면, 다음과 같은 두려움이 있습니다. 운없는.

1

Proxy.getInvocationHandler (proxy) 메소드를 사용하여 원래 InvocationHandler를 얻을 수 있습니다.

+4

그건 감싸 인 객체가 아닙니다. –

8

Proxy.getInvocationHandler (proxy)는 핸들러를 반환하지만 문제는 핸들러에서 원래 객체를 추출하는 것입니다. 처리기가 익명 클래스 인 경우 원본 개체를 추출하는 유일한 방법은 reflection을 사용하고 val $ something이라는 필드에서 원본을 추출하는 것입니다.이 메서드는 매우 못생긴 메서드입니다.

((YourHandler)Proxy.getInvocationHandler(proxy)).getOriginalObject() 
관련 문제