使用泛型代理

时间:2014-01-09 13:31:36

标签: java generics proxy-classes

我使用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);

难以阅读。

有什么想法吗?

1 个答案:

答案 0 :(得分: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()。但同样,反思的全部意义在于,您只能在运行时知道类类型,而不是在泛型有用的编译时。