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