Для чего нужны прокси в Java?

Я читаю раздел «Прокси-серверы» в известной книге Хорстманна «Ядро Java». Однако я новичок в этой концепции. Как написано в книге, прокси необходимы только тогда, когда вы еще не знаете во время компиляции, какие интерфейсы вам нужно реализовать. Однако, когда вы создаете прокси-объект, вам необходимо предоставить массив объектов класса, которые являются всего лишь интерфейсами, которые необходимо реализовать. Разве это не похоже на внутреннее противоречие? Пожалуйста, освети меня. Спасибо!


person HFanJava    schedule 24.02.2014    source источник
comment
В чем вы видите здесь конфликт с самим собой?   -  person PM 77-1    schedule 24.02.2014
comment
Если вы можете предоставить массив интерфейсов для реализации, это должно означать, что вы уже знаете, какие интерфейсы вам нужно реализовать.   -  person HFanJava    schedule 24.02.2014
comment
Когда нужно поставить массив?   -  person PM 77-1    schedule 24.02.2014
comment
you don't yet know at compile time, а что насчет времени выполнения, вы, вероятно, узнаете сейчас.   -  person Marc-Andre    schedule 24.02.2014
comment
когда вы создаете прокси-объект, используя Proxy.newProxyInstance (...), что, боюсь, даже до компиляции.   -  person HFanJava    schedule 24.02.2014
comment
фиктивный фреймворк должен стать популярным вариантом использования прокси-серверов с момента его написания. не зная классов, над которыми он должен издеваться.   -  person zapl    schedule 25.02.2014
comment
Правильно. Пример, использованный в книге, предоставил Class [] во время компиляции, возможно, из-за того, что это просто игрушечная иллюстрация.   -  person HFanJava    schedule 25.02.2014


Ответы (1)


Нет, противоречия нет.

Этот массив объектов класса, который вам нужно предоставить, может быть динамическим, то есть создаваться во время выполнения. Обычно его можно прочитать из файла конфигурации, куда вы загрузите объект Class из String. Обычно так много фреймворков (например, Spring для внедрения зависимостей) работают при создании экземпляра прокси.

Адаптированный пример из Proxy javadoc:

String className = readClassNameFromFile(); 
Class<?> myClass = Class.forName(className);
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                          new Class[] { myClass },
                                          handler);
person LaurentG    schedule 24.02.2014
comment
Спасибо за ваш ответ! Этот пример определенно развеял мои сомнения. - person HFanJava; 24.02.2014