我使用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
但是没有动态方式吗?
答案 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()]));