Proxy-Pattern с несколькими интерфейсами
Я использую instanceof
проверить возможности.
interface Animal{}
class AnimalImpl{}
class Cage{
public Animal animal;
}
Если у меня есть клетка cage
с животным и хотел бы добавить прокси для Fly и Run для животных
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 ответ
Решение
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()]));