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