具有多个接口的代理模式

时间:2014-01-16 14:15:26

标签: java proxy-pattern

我使用instanceof来测试功能。

interface Animal{}
class AnimalImpl{}
class Cage{
    public Animal animal;
}

如果我有一个笼子cage与动物一样,并且喜欢为动物添加代理并运行动物

interface Fly{}
interface Run{}

我做以下

01 ClassLoader cl = class.getClassLoader();
02 cage.animal = new AnimalImpl();
03
04 // Add fly
05 Class proxyFly = Proxy.getProxyClass(cl, Animal.class, Fly.class);
06 cage.animal = (Animal) proxyFly.getConstructor(new Class[]{InvocationHandler.class}).newInstance(ih);
07
08 // Add run
09 Class proxyFly = Proxy.getProxyClass(cl, Animal.class, Run.class);
10 cage.animal = (Animal) proxyFly.getConstructor(new Class[]{InvocationHandler.class}).newInstance(ih);
11 assert cage.animal implements Fly;

第11行失败。在第09行,我需要添加Fly.class但是没有动态方式吗?

1 个答案:

答案 0 :(得分:0)

Proxy.getProxyClass接受varargs接口。只需构建一个类数组即可传递给它。如果您在编译时不确定要传递的接口数或接口数,那么您可以将它们存储到列表中,然后调用toArray(T[])将列表转换为数组

List<Class> interfaces = new LinkedList<Class>();
interfaces.add(Animal.class);
if (cage.animal instanceof Run) {
    interfaces.add(Run.class);
}
if (cage.animal instanceof Fly) {
    interfaces.add(Fly.class);
}

Proxy.getProxyClass(cl, interfaces.toArray(new Class[interfaces.size()]));