0

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但没有动态方法吗?

4

1 回答 1

0

Proxy.getProxyClass接受可变参数的接口。只需建立一个类数组来传递给它。如果您在编译时不确定要传递哪个或多少个接口,那么您可以将它们存储到一个列表中,然后调用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()]));
于 2014-01-16T15:07:38.947 回答