|
Spec-Zone .ru
спецификации, руководства, описания, API
|
public class Proxy extends Object implements Serializable
Proxy обеспечивает статические методы для того, чтобы они создали динамические прокси-классы и экземпляры, и это - также суперкласс всех динамических прокси-классов, создаваемых теми методами. Создать прокси для некоторого интерфейса Foo:
InvocationHandler handler = new MyInvocationHandler(...);
Class proxyClass = Proxy.getProxyClass(
Foo.class.getClassLoader(), new Class[] { Foo.class });
Foo f = (Foo) proxyClass.
getConstructor(new Class[] { InvocationHandler.class }).
newInstance(new Object[] { handler });
или более просто:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class[] { Foo.class },
handler);
Динамический прокси-класс (просто называемый прокси-классом ниже) является классом, который реализует список интерфейсов, определенных во время выполнения, когда класс создается с поведением как описано ниже. Интерфейс прокси является таким интерфейсом, который реализуется прокси-классом. Экземпляр прокси является экземпляром прокси-класса. У каждого экземпляра прокси есть связанный объект-обработчик вызова, который реализует интерфейс InvocationHandler. Вызов метода на экземпляре прокси через один из его интерфейсов прокси будет диспетчеризирован invoke метод обработчика вызова экземпляра, передавая экземпляр прокси, a java.lang.reflect.Method объект, идентифицирующий метод, который был вызван, и массив типа Object содержа параметры. Обработчик вызова обрабатывает закодированный вызов метода как соответствующий и результат, который это возвращает, будет возвращен как результат вызова метода на экземпляре прокси.
У прокси-класса есть следующие свойства:
"$Proxy" должен быть, однако, зарезервирован для прокси-классов. java.lang.reflect.Proxy. getInterfaces на Class объект возвратит массив, содержащий тот же самый список интерфейсов (в порядке, определенном при его создании), вызывая getMethods на Class объект возвратит массив Method объекты, которые включают все методы в тех интерфейсах, и вызов getMethod найдет методы в интерфейсах прокси, как ожидался бы. Proxy.isProxyClass метод возвратит true, если это передадут прокси-класс - класс, возвращенный Proxy.getProxyClass или класс объекта, возвращенного Proxy.newProxyInstance- и ложь иначе. java.security.ProtectionDomain из прокси-класса то же самое как тот из системных классов, загруженных загрузчиком класса начальной загрузки, такой как java.lang.Object, потому что код для прокси-класса сгенерирован кодом достоверной системы. Этот домен защиты будут обычно предоставлять java.security.AllPermission. InvocationHandler, установить обработчик вызова для экземпляра прокси. Вместо того, чтобы иметь необходимость использовать API Reflection, чтобы получить доступ к общедоступному конструктору, экземпляр прокси может быть также быть созданным, вызывая Proxy.newProxyInstance метод, который комбинирует действия вызова Proxy.getProxyClass с вызовом конструктора с обработчиком вызова. У экземпляра прокси есть следующие свойства:
proxy и один из интерфейсов реализуется его прокси-классом Foo, следующее выражение возвратит true:
proxy instanceof Foo
и следующая работа броска успешно выполнится (вместо того, чтобы бросить a ClassCastException):
(Foo) proxy
Proxy.getInvocationHandler метод возвратит обработчик вызова, связанный с экземпляром прокси, который передают как его параметр. invoke метод как описано в документации для того метода. hashCode, equals, или toString методы, объявленные в java.lang.Object на прокси экземпляр будет закодирован и диспетчеризирован обработчику вызова invoke метод тем же самым способом как интерфейсные вызовы метода кодируется и диспетчеризируется, как описано выше. Класс объявления Method объект, к которому передают invoke будет java.lang.Object. Другие открытые методы экземпляра прокси, наследованного от java.lang.Object не переопределяются прокси-классом, таким образом, вызовы тех методов ведут себя как, они делают для экземпляров java.lang.Object. Когда два или больше интерфейса прокси-класса содержат метод с тем же самым именем и подписью параметра, порядок интерфейсов прокси-класса становится существенным. Когда такой двойной метод вызывается на экземпляр прокси, Method объект, который передают к обработчику вызова, не обязательно будет тем, объявление которого класса присваиваемо от ссылочного типа интерфейса, что метод прокси был вызван через. Это ограничение существует, потому что соответствующая реализация метода в сгенерированном прокси-классе не может определить, какой интерфейс это было вызвано через. Поэтому, когда двойной метод вызывается на экземпляр прокси, Method объект для метода в передовом интерфейсе, который содержит метод (или непосредственно или наследованный через суперинтерфейс) в списке прокси-класса интерфейсов, передают к обработчику вызова invoke метод, независимо от ссылочного типа, через который произошел вызов метода.
Если интерфейс прокси содержит метод с тем же самым именем и подписью параметра как hashCode, equals, или toString методы java.lang.Object, когда такой метод вызывается на экземпляр прокси, Method объект, который передают к обработчику вызова, будет иметь java.lang.Object как его объявление класса. Другими словами, общественность, незаключительные методы java.lang.Object логически предшествуйте всем интерфейсам прокси для определения который Method возразите, чтобы передать к обработчику вызова.
Отметьте также это, когда двойной метод диспетчеризируется обработчику вызова, invoke метод может только бросить проверенные типы исключения, которые присваиваемы одному из исключения, вводит throws пункт метода во всех интерфейсах прокси, что это может быть вызвано через. Если invoke метод выдает проверенное исключение, которое не присваиваемо любому из типов исключения, объявленных методом в одном из интерфейсов прокси, что это может быть вызвано через, затем непроверенное UndeclaredThrowableException будет брошен вызовом на экземпляре прокси. Это ограничение означает что не все типы исключения, возвращенные, вызывая getExceptionTypes на Method объект, который передают к invoke метод может обязательно быть брошен успешно invoke метод.
InvocationHandler, Сериализированная Форма| Модификатор и Тип | Поле и Описание |
|---|---|
protected InvocationHandler |
h
обработчик вызова для этого экземпляра прокси.
|
| Модификатор | Конструктор и Описание |
|---|---|
protected |
Proxy(InvocationHandler h)
Создает новое
Proxy экземпляр от подкласса (обычно, динамический прокси-класс) с указанным значением для его обработчика вызова. |
| Модификатор и Тип | Метод и Описание |
|---|---|
static InvocationHandler |
getInvocationHandler(Object proxy)
Возвращает обработчик вызова для указанного экземпляра прокси.
|
static Class<?> |
getProxyClass(ClassLoader loader, Class<?>... interfaces)
Возвраты
java.lang.Class объект для прокси-класса, данного загрузчик класса и массив интерфейсов. |
static boolean |
isProxyClass(Class<?> cl)
Возвращает true, если и только если указанный класс был динамически сгенерирован, чтобы быть прокси-классом, используя
getProxyClass метод или newProxyInstance метод. |
static Object |
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
Возвращает экземпляр прокси-класса для указанных интерфейсов, который диспетчеризирует вызовы метода указанному обработчику вызова.
|
protected InvocationHandler h
protected Proxy(InvocationHandler h)
Proxy экземпляр от подкласса (обычно, динамический прокси-класс) с указанным значением для его обработчика вызова.h - обработчик вызова для этого экземпляра проксиpublic static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) throws IllegalArgumentException
java.lang.Class объект для прокси-класса, данного загрузчик класса и массив интерфейсов. Прокси-класс будет определен указанным загрузчиком класса и реализует все предоставленные интерфейсы. Если прокси-класс для той же самой перестановки интерфейсов был уже определен загрузчиком класса, то существующий прокси-класс будет возвращен; иначе, прокси-класс для тех интерфейсов будет сгенерирован динамически и определен загрузчиком класса. Есть несколько ограничений на параметры, к которым можно передать Proxy.getProxyClass:
Class объекты в interfaces массив должен представить интерфейсы, не классы или типы примитивов. interfaces массив может обратиться к идентичному Class объекты. cl и каждый интерфейс i, следующее выражение должно быть истиной:
Class.forName(i.getName(), false, cl) == i
interfaces массив не должен превысить 65535. Если какое-либо из этих ограничений нарушается, Proxy.getProxyClass бросит IllegalArgumentException. Если interfaces параметр массива или любой из его элементов null, a NullPointerException будет брошен.
Отметьте, что порядок указанных интерфейсов прокси является существенным: два запроса на прокси-класс с той же самой комбинацией интерфейсов, но в различном порядке приведут к двум отличным прокси-классам.
loader - загрузчик класса, чтобы определить прокси-классinterfaces - список интерфейсов для прокси-класса, чтобы реализоватьIllegalArgumentException - если любое из ограничений на параметры, к которым можно передать getProxyClass нарушаютсяNullPointerException - если interfaces параметр массива или любой из его элементов nullpublic static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
Proxy.getProxyClass(loader, interfaces).
getConstructor(new Class[] { InvocationHandler.class }).
newInstance(new Object[] { handler });
Proxy.newProxyInstance броски IllegalArgumentException по тем же самым причинам это Proxy.getProxyClass делает.
loader - загрузчик класса, чтобы определить прокси-классinterfaces - список интерфейсов для прокси-класса, чтобы реализоватьh - обработчик вызова, чтобы диспетчеризировать вызовы методаIllegalArgumentException - если любое из ограничений на параметры, к которым можно передать getProxyClass нарушаютсяNullPointerException - если interfaces параметр массива или любой из его элементов null, или если обработчик вызова, h, nullpublic static boolean isProxyClass(Class<?> cl)
getProxyClass метод или newProxyInstance метод. Надежность этого метода важна для возможности использовать это, чтобы принять решения безопасности, таким образом, ее реализация не должна просто протестировать, если рассматриваемый класс расширяется Proxy.
cl - класс тестаtrue если класс является прокси-классом и false иначеNullPointerException - если cl nullpublic static InvocationHandler getInvocationHandler(Object proxy) throws IllegalArgumentException
proxy - экземпляр прокси, чтобы возвратить обработчик вызова дляIllegalArgumentException - если параметром не является экземпляр прокси
Для дальнейшей ссылки API и документации разработчика, см. . Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.