2014-01-09 34 views
2

我用java.lang.reflect.Proxy代理对象。用泛型代理

我有这个类:

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); 

是难以阅读。

任何想法?

+0

难以阅读的问题是? –

+0

是的。 '类'不是精确的。 –

+1

反问题:你想写什么,即你认为什么足够精确而又容易阅读?你能提供一些伪代码来帮助我们理解你的目标吗? – Thomas

回答

2

Proxy#getProxyClass(ClassLoader, Class)方法声明为

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

它的返回类型因此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()。但是,同样重要的一点是,您只能在运行时了解类的类型,而不能在编译时使用泛型。

+0

是的,就是这样。我将它命名为PROXY而不是T. –