Proxy Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также суперкласса всех динамических прокси-классов, созданных этими методами.
[Android.Runtime.Register("java/lang/reflect/Proxy", DoNotGenerateAcw=true)]
public class Proxy : Java.Lang.Object, IDisposable, Java.IO.ISerializable
[<Android.Runtime.Register("java/lang/reflect/Proxy", DoNotGenerateAcw=true)>]
type Proxy = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- Наследование
- Атрибуты
- Реализации
Комментарии
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);
Динамический прокси-класс (просто называемый классом прокси ниже) — это класс, реализующий список интерфейсов, указанных во время выполнения при создании класса, с поведением, как описано ниже.
Прокси-интерфейс — это такой интерфейс, реализованный классом прокси-сервера.
Экземпляр прокси-сервера — это экземпляр класса прокси-сервера.
Каждый экземпляр прокси-сервера имеет связанный объект обработчика вызовов , который реализует интерфейс InvocationHandler. Вызов метода для экземпляра прокси-сервера через один из его интерфейсов прокси-сервера будет отправлен InvocationHandler#invoke invoke в метод обработчика вызова экземпляра, передав экземпляр прокси-сервера, объект, java.lang.reflect.Method определяющий метод, который был вызван, и массив типа Object , содержащего аргументы. Обработчик вызовов обрабатывает вызов закодированного метода соответствующим образом, и результат, который он возвращает, будет возвращен в результате вызова метода в экземпляре прокси-сервера.
Класс прокси-сервера имеет следующие свойства:
<Классы прокси-сервера ul><li>являются <>общедоступными, окончательными и не абстрактными или< em>, если все прокси-интерфейсы являются общедоступными.</li>
<классы li>Proxy являются <em>non-public, final, and not abstract</em> , если любой из прокси-интерфейсов не является общедоступным.</li>
<Li>Unqualified name of a proxy class is unspecified. Пространство имен классов, начинающихся со строки "$Proxy" , должно быть зарезервировано для прокси-классов.
<li>Прокси-класс расширяется java.lang.reflect.Proxy.
<li>Прокси-класс реализует именно интерфейсы, указанные при его создании, в том же порядке.
<li>, если прокси-класс реализует недоступный интерфейс, он будет определен в том же пакете, что и этот интерфейс. В противном случае пакет прокси-класса также не указан. Обратите внимание, что запечатывание пакетов не будет препятствовать успешному определению класса прокси-сервера в определенном пакете во время выполнения, и ни один класс не будет определяться тем же загрузчиком класса и тем же пакетом с определенными подписывющими средствами.
<li>, так как прокси-класс реализует все интерфейсы, указанные при создании, вызывая getInterfaces его Class объект, вернет массив, содержащий тот же список интерфейсов (в порядке, указанном при его создании), вызывая getMethods его Class объект, вернет массив Method объектов, включающих все методы в этих интерфейсах, и вызовы getMethod будут находить методы в интерфейсах прокси-сервера, как ожидалось.
<li>Метод возвращает значение true, если он передается прокси-класс - класс, возвращаемый или класс объекта, возвращаемого Proxy#isProxyClass Proxy.isProxyClass объектом, возвращенным Proxy.getProxyClass-- и false в противном Proxy.newProxyInstance случае.
<li>Класс java.security.ProtectionDomain прокси-сервера совпадает с классом системы, загруженным загрузчиком класса начальной загрузки, например java.lang.Object, так как код для прокси-класса создается доверенным системным кодом. Обычно этот домен защиты предоставляется java.security.AllPermission.
<Li>Каждый прокси-класс имеет один открытый конструктор, который принимает один аргумент, реализацию интерфейса InvocationHandler, чтобы задать обработчик вызова для экземпляра прокси-сервера. Вместо того чтобы использовать API отражения для доступа к общедоступному конструктору, экземпляр прокси-сервера также можно создать путем вызова Proxy#newProxyInstance Proxy.newProxyInstance метода, который объединяет действия Proxy#getProxyClass Proxy.getProxyClass вызова с вызовом конструктора с обработчиком вызова.
</ul>
Экземпляр прокси-сервера имеет следующие свойства:
<ul><li>При выполнении экземпляра proxy прокси-сервера и одного из интерфейсов, реализованных его прокси-классом Foo, следующее выражение возвращает значение true:
{@code proxy instanceof Foo}
и следующая операция приведения завершится успешно (а не вызовет ClassCastException):
{@code (Foo) proxy}
<li>Каждый экземпляр прокси-сервера имеет связанный обработчик вызова, который был передан в его конструктор.
Proxy#getInvocationHandler Proxy.getInvocationHandler Статический метод вернет обработчик вызова, связанный с экземпляром прокси-сервера, переданным в качестве аргумента.
<li>Вызов метода интерфейса для экземпляра прокси-сервера будет закодирован и отправлен в метод обработчика InvocationHandler#invoke invoke вызовов, как описано в документации по данному методу.
<li>Вызов hashCodeметода или equalstoStringметодов, объявленных в java.lang.Object экземпляре прокси-сервера, будет закодирован и отправлен в метод обработчика invoke вызовов таким же образом, как вызовы методов интерфейса кодируются и отправляются, как описано выше. Декларативный класс переданного Methodinvoke объекта.java.lang.Object Другие общедоступные методы экземпляра прокси-сервера, унаследованного от java.lang.Object него, не переопределяются классом прокси, поэтому вызовы этих методов ведут себя так, как они выполняются для экземпляров java.lang.Object.
</ul>
<Методы h3>, повторяющиеся в нескольких прокси-интерфейсах</h3>
Если два или более интерфейсов прокси-класса содержат метод с одинаковым именем и сигнатурой параметра, порядок интерфейсов прокси-класса становится значительным. При вызове такого повторяющегося метода в экземпляре прокси-сервера объект, переданный обработчику вызова, Method не обязательно будет тем, в котором декларируемый класс можно назначить из ссылочного типа интерфейса, через который был вызван метод прокси-сервера. Это ограничение существует, так как соответствующая реализация метода в созданном классе прокси-сервера не может определить, через какой интерфейс он был вызван. Таким образом, при вызове повторяющегося метода в экземпляре прокси-сервера Method объект для метода в первом интерфейсе, который содержит метод (напрямую или наследуется через суперинтерface) в списке интерфейсов прокси-класса передается методу обработчика invoke вызовов независимо от ссылочного типа, с помощью которого произошел вызов метода.
Если прокси-интерфейс содержит метод с тем же именем и сигнатурой параметра, что hashCodeequalsи методы , или toString методыjava.lang.Object, когда такой метод вызывается в экземпляре прокси-сервера, объект, переданный обработчику вызова, Method будет иметь java.lang.Object значение своего декларативного класса. Другими словами, общедоступные, не окончательные методы java.lang.Object логически предшествуют всем прокси-интерфейсам для определения Method объекта, передаваемого обработчику вызова.
Обратите внимание также, что при отправке дубликата метода в обработчик invoke вызова метод может вызывать только проверенные типы исключений, которые можно назначить одному из типов исключений в throws предложении метода во всех прокси-интерфейсах, через которые его можно вызвать.
invoke Если метод вызывает проверенное исключение, которое нельзя назначить любому из типов исключений, объявленных методом в одном из прокси-интерфейсов, которые его можно вызвать, то при вызове в экземпляре прокси-сервера возникает отмена.UndeclaredThrowableException Это ограничение означает, что не все типы исключений, возвращаемые вызовом getExceptionTypes объекта, Method переданного invoke методу, обязательно могут быть успешно вызваны методом invoke .
Добавлено в версии 1.3.
Java документации по java.lang.reflect.Proxy.
Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".
Конструкторы
| Имя. | Описание |
|---|---|
| Proxy(IInvocationHandler) |
Создает новый |
| Proxy(IntPtr, JniHandleOwnership) |
Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения. |
Свойства
| Имя. | Описание |
|---|---|
| Class |
Возвращает класс среды выполнения этого |
| H |
обработчик вызова для этого экземпляра прокси-сервера. |
| Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
| JniIdentityHashCode |
Возвращает хэш-код удостоверения, назначенный этому Java одноранговой среде выполнения взаимодействия. (Унаследовано от Object) |
| JniManagedPeerState |
|
| JniPeerMembers |
|
| PeerReference |
Возвращает ссылку на объект JNI для этого Java однорангового узла. (Унаследовано от Object) |
| ThresholdClass |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
| ThresholdType |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
Методы
| Имя. | Описание |
|---|---|
| Clone() |
Создает и возвращает копию этого объекта. (Унаследовано от Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
|
| Dispose() |
Освобождает ресурсы, удерживаемые этим Java одноранговым узлом. (Унаследовано от Object) |
| Dispose(Boolean) |
Освобождает ресурсы, удерживаемые этим Java одноранговым узлом. (Унаследовано от Object) |
| DisposeUnlessReferenced() |
|
| Equals(Object) |
|
| Equals(Object) |
Указывает, равен ли другой объект этому объекту. (Унаследовано от Object) |
| GetHashCode() |
Возвращает хэш-значение кода для объекта. (Унаследовано от Object) |
| GetInvocationHandler(Object) |
Возвращает обработчик вызова для указанного экземпляра прокси-сервера. |
| GetProxyClass(ClassLoader, Class[]) |
|
| IsProxyClass(Class) |
Возвращает значение true, если и только если указанный класс был динамически создан для создания прокси-класса с помощью |
| JavaFinalize() |
Устаревшие.
Вызывается сборщиком мусора в объекте, когда сборка мусора определяет, что больше ссылок на объект нет. (Унаследовано от Object) |
| NewProxyInstance(ClassLoader, Class[], IInvocationHandler) |
Возвращает экземпляр прокси-класса для указанных интерфейсов, отправляющих вызовы метода в указанный обработчик вызова. |
| Notify() |
Просыпается один поток, ожидающий монитора этого объекта. (Унаследовано от Object) |
| NotifyAll() |
Просыпает все потоки, ожидающие монитора этого объекта. (Унаследовано от Object) |
| SetHandle(IntPtr, JniHandleOwnership) |
Задает свойство Handle. (Унаследовано от Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
|
| ToArray<T>() |
Создает управляемый массив из этого Java оболочки массива. (Унаследовано от Object) |
| ToString() |
Возвращает строковое представление объекта. (Унаследовано от Object) |
| UnregisterFromRuntime() |
Отменяет регистрацию этого Java однорангового узла из среды выполнения взаимодействия. (Унаследовано от Object) |
| Wait() |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, путем <><уведомления/>em или <эм>прерванного</em.> (Унаследовано от Object) |
| Wait(Int64, Int32) |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прерваны< или> до тех пор, пока не истекло определенное количество реального времени. (Унаследовано от Object) |
| Wait(Int64) |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прерваны< или> до тех пор, пока не истекло определенное количество реального времени. (Унаследовано от Object) |
Явные реализации интерфейса
| Имя. | Описание |
|---|---|
| IJavaPeerable.Disposed() |
|
| IJavaPeerable.Finalized() |
|
| IJavaPeerable.JniObjectReferenceControlBlock |
|
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
| IJavaPeerable.SetPeerReference(JniObjectReference) |
|
| IJavaPeerable.UnregisterFromRuntime() |
|
Методы расширения
| Имя. | Описание |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Возвращает имя JNI типа экземпляра |
| JavaAs<TResult>(IJavaPeerable) |
Попробуйте принуждать к типу |
| JavaCast<TResult>(IJavaObject) |
Выполняет преобразование типа, проверяемого средой выполнения Android. |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Попробуйте принуждать к типу |