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()]));
Другие вопросы по тегам