2014-01-09 3 views
2

프록시 개체에 java.lang.reflect.Proxy을 사용합니다.Generics로 프록시하기

여기
public class TransportableImpl extends Transportable{ 
    public class OrderInvoker extends InvocationHandler{ 
      ... 
    } 
} 

내가 프록시를 구축 :

Transportable t = new TransportableImpl(); 
Order myOrder = new OrderImpl(); 
Class proxyClass = Proxy.getProxyClass(getClass().getClassLoader(), Transportable.class, Order.class); 
Object serializable = proxyClass.getConstructor(new Class[]{InvocationHandler.class}).newInstance(t.new OrderInvoker(myOrder)); 

문제는 다음과 같습니다 클래스는 원시 타입과

Class<? extends Order & Transportable> proxyClass = 
    (Class<? extends Order & Transportable>) 
    Proxy.getProxyClass(getClass().getClassLoader(), 
    Transportable.class, Order.class); 

읽기 어려운

나는이 클래스를 가지고있다.

아이디어가 있으십니까?

public static Class<?> getProxyClass(ClassLoader loader, 
            Class<?>... interfaces) 

귀환 형 따라서 Class<?> 같이

+0

읽기가 어렵다는 문제가 있습니까? –

+0

예. 그리고'Class '은 정확하지 않습니다. –

+1

반문 질문 : 무엇을 쓰기를 원하십니까? 즉, 충분히 정확하면서도 읽기 쉬운 것이 무엇이라고 생각하십니까? 당신이 목표로하는 것을 이해하는 데 도움이되는 의사 코드를 제공 할 수 있습니까? – Thomas

답변

2

Proxy#getProxyClass(ClassLoader, Class) 방법 선언된다. 일반적인 구문은

Class proxyClass<?> = Proxy.getProxyClass(getClass().getClassLoader(), Transportable.class, Order.class); 

은 기술적으로는

public <T extends Order & Transportable> void doSomething() { 
    Class<T> proxyClass = (Class<T>) Proxy.getProxyClass(Driver.class.getClassLoader(), 
      Transportable.class, Order.class); 
} 

(경고와 함께) 할 수있을 것입니다하지만 당신은 T 변수 것을 사용할 필요가 없습니다 꽤 많은 않을 것 같은 그런 당신에게 아무것도 얻는 없습니다. Class 클래스는이를 사용하는 메소드가 거의 없습니다. 즉, getConstructor(Class...)newInstance()입니다. 그러나 다시 한 번 강조하자면, generics가 유용한 컴파일 타임이 아니라 런타임에 클래스 유형을 알 수 있다는 것입니다.

+0

예, 그게 전부입니다. 나는 그것을 T 대신 PROXY라고 명명했다. –