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
параметр массива или любой из его элементов null
public 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
, null
public static boolean isProxyClass(Class<?> cl)
getProxyClass
метод или newProxyInstance
метод. Надежность этого метода важна для возможности использовать это, чтобы принять решения безопасности, таким образом, ее реализация не должна просто протестировать, если рассматриваемый класс расширяется Proxy
.
cl
- класс тестаtrue
если класс является прокси-классом и false
иначеNullPointerException
- если cl
null
public static InvocationHandler getInvocationHandler(Object proxy) throws IllegalArgumentException
proxy
- экземпляр прокси, чтобы возвратить обработчик вызова дляIllegalArgumentException
- если параметром не является экземпляр прокси
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.