Proxy Класс

Определение

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

[Android.Runtime.Register("java/lang/reflect/Proxy", DoNotGenerateAcw=true)]
public class Proxy : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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
Атрибуты
Реализации

Комментарии

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

Создание прокси-сервера для некоторого интерфейса Foo:

InvocationHandler handler = new MyInvocationHandler(...);
                Class&lt;?&gt; 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&lt;?&gt;[] { Foo.class },
                                                     handler);

Динамический прокси-класс (просто называемый прокси-классом ниже) — это класс, реализующий список интерфейсов, указанных во время выполнения при создании класса, с поведением, описанным ниже.

Прокси-интерфейс — это интерфейс, реализованный прокси-классом.

Экземпляр прокси-сервера — это экземпляр прокси-класса.

Каждый экземпляр прокси-сервера имеет связанный объект обработчика вызова , который реализует интерфейс InvocationHandler. Вызов метода в экземпляре прокси-сервера через один из его прокси-интерфейсов будет перенаправляться InvocationHandler#invoke invoke в метод обработчика вызова экземпляра, передав экземпляр прокси-сервера, объект, определяющий java.lang.reflect.Method метод, который был вызван, и массив типа Object , содержащий аргументы. Обработчик вызова обрабатывает вызов закодированного метода соответствующим образом, и результат, возвращаемый им, будет возвращен в качестве результата вызова метода на экземпляре прокси-сервера.

Прокси-класс имеет следующие свойства:

<Классы ul>li Proxy являются открытыми><, окончательными, а не abstract</em>, если все прокси-интерфейсы являются открытыми.<></Литий>

<Классы прокси-сервера li>>не являются <открытыми, окончательными и не абстрактными</em>, если какой-либо из прокси-интерфейсов не является открытым.</Литий>

<li>Неполное имя прокси-класса не указано. Однако пространство имен классов, начинающихся со строки "$Proxy" , должно быть зарезервировано для прокси-классов.

<Li>Прокси-класс расширяет java.lang.reflect.Proxy.

<Li>Прокси-класс реализует именно интерфейсы, указанные при его создании, в том же порядке.

<Li>Если прокси-класс реализует недоступный интерфейс, он будет определен в том же пакете, что и этот интерфейс. В противном случае пакет прокси-класса также не указан. Обратите внимание, что запечатывание пакетов не помешает успешному определению прокси-класса в определенном пакете во время выполнения, а также классы, уже определенные тем же загрузчиком классов и тем же пакетом с определенными подписывающими.

<Li>Так как прокси-класс реализует все интерфейсы, указанные при создании, при вызове getInterfacesClass объекта возвращается массив, содержащий тот же список интерфейсов (в порядке, указанном при создании), при вызове getMethodsClass объекта возвращается массив Method объектов, включающих все методы в этих интерфейсах, а при вызове getMethod будут находиться методы в прокси-интерфейсах, как и ожидалось.

<Li>Метод Proxy#isProxyClass Proxy.isProxyClass возвращает значение true, если ему передан прокси-класс ( класс, возвращаемый методом Proxy.getProxyClass , или класс объекта , возвращаемый ) Proxy.newProxyInstanceи false в противном случае.

<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методов , или toString , equalsобъявленных в java.lang.Object на экземпляре прокси-сервера, будет закодирован и отправлен в метод обработчика invoke вызова так же, как вызовы метода интерфейса кодируются и отправляются, как описано выше. Объявляющий класс объекта, переданного в Method , invoke будет иметь значение java.lang.Object. Другие открытые методы экземпляра прокси-сервера, унаследованного от java.lang.Object , не переопределяются прокси-классом, поэтому вызовы этих методов ведут себя так же, как и для экземпляров java.lang.Object. </ul>

<Методы h3>дублируются в нескольких прокси-интерфейсах</h3>

Если два или более интерфейсов прокси-класса содержат метод с одинаковым именем и сигнатурой параметра, порядок интерфейсов прокси-класса становится значительным. При вызове такого повторяющегося метода на экземпляре прокси-сервера объект, передаваемый обработчику вызова, Method не обязательно будет объектом, класс объявления которого можно назначить из ссылочного типа интерфейса, с помощью которого был вызван метод прокси-сервера. Это ограничение существует, поскольку соответствующая реализация метода в созданном прокси-классе не может определить, через какой интерфейс он был вызван. Таким образом, при вызове повторяющегося метода в экземпляре Method прокси-сервера объект метода в интерфейсе передовика, который содержит метод (напрямую или наследуется через суперинтерфейс) в списке интерфейсов прокси-класса, передается методу обработчика invoke вызова независимо от ссылочного типа, с помощью которого был выполнен вызов метода.

Если прокси-интерфейс содержит метод с тем же именем и сигнатурой java.lang.Objectпараметра, что hashCodeи методы , equalsили toString , при вызове такого метода на экземпляре прокси-сервера, объект, переданный обработчику вызова, Method будет иметь java.lang.Object объявляющий класс. Иными словами, открытые, не окончательные методы java.lang.Object логически предшествуют всем прокси-интерфейсам для определения объекта, передаваемого Method обработчику вызова.

Обратите внимание также, что при отправке повторяющегося метода обработчику вызова метод может выдавать только проверенные типы исключений, invoke которые могут быть назначены одному из типов исключений в throws предложении метода во всех прокси-интерфейсах, через которые он может вызываться. invoke Если метод создает проверенное исключение, которое не может быть назначено ни одному из типов исключений, объявленных методом в одном из интерфейсов прокси-сервера, через который его можно вызвать, то вызов на экземпляре прокси-сервера вызовет неконтролируемое UndeclaredThrowableException исключение. Это ограничение означает, что не все типы исключений, возвращаемые вызовом getExceptionTypesMethod объекта, переданного invoke методу, могут быть успешно вызваны методом invoke .

Добавлено в версии 1.3.

Документация по Java для java.lang.reflect.Proxy.

Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License Creative Commons 2.5 Attribution License.

Конструкторы

Proxy(IInvocationHandler)

Создает новый Proxy экземпляр из подкласса (как правило, динамического прокси-класса) с указанным значением для обработчика вызова.

Proxy(IntPtr, JniHandleOwnership)

Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения.

Свойства

Class

Возвращает класс среды выполнения данного объекта Object.

(Унаследовано от Object)
H

обработчик вызова для данного экземпляра прокси-сервера.

Handle

Дескриптор базового экземпляра Android.

(Унаследовано от Object)
JniIdentityHashCode

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
JniPeerMembers

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

PeerReference

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
ThresholdClass

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

ThresholdType

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

Методы

Clone()

Создает и возвращает копию этого объекта.

(Унаследовано от Object)
Dispose()

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
Dispose(Boolean)

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
Equals(Object)

Указывает, равен ли какой-то другой объект этому объекту.

(Унаследовано от Object)
GetHashCode()

Возвращает значение хэш-кода для объекта.

(Унаследовано от Object)
GetInvocationHandler(Object)

Возвращает обработчик вызова для указанного экземпляра прокси-сервера.

GetProxyClass(ClassLoader, Class[])

java.lang.Class Возвращает объект для прокси-класса, заданного загрузчиком класса и массивом интерфейсов.

IsProxyClass(Class)

Возвращает значение true, если и только в том случае, если указанный класс был динамически создан в качестве прокси-класса с помощью getProxyClass метода или newProxyInstance метода .

JavaFinalize()

Вызывается сборщиком мусора для объекта , когда сборка мусора определяет, что больше нет ссылок на объект .

(Унаследовано от Object)
NewProxyInstance(ClassLoader, Class[], IInvocationHandler)

Возвращает экземпляр прокси-класса для указанных интерфейсов, который отправляет вызовы методов в указанный обработчик вызова.

Notify()

Пробуждение одного потока, ожидающего на мониторе этого объекта.

(Унаследовано от Object)
NotifyAll()

Активирует все потоки, ожидающие на мониторе этого объекта.

(Унаследовано от Object)
SetHandle(IntPtr, JniHandleOwnership)

Задает свойство Handle.

(Унаследовано от Object)
ToArray<T>()

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
ToString()

Возвращает строковое представление объекта.

(Унаследовано от Object)
UnregisterFromRuntime()

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
Wait()

Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления/><em> или <прерывания></em>.

(Унаследовано от Object)
Wait(Int64)

Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления</>em>, <>прерывания< или> em, либо до истечения определенного количества реального времени.

(Унаследовано от Object)
Wait(Int64, Int32)

Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления</>em>, <>прерывания< или> em, либо до истечения определенного количества реального времени.

(Унаследовано от Object)

Явные реализации интерфейса

IJavaPeerable.Disposed()

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
IJavaPeerable.DisposeUnlessReferenced()

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
IJavaPeerable.Finalized()

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
IJavaPeerable.JniManagedPeerState

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

(Унаследовано от Object)

Методы расширения

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверенное средой выполнения Android.

JavaCast<TResult>(IJavaObject)

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

GetJniTypeName(IJavaPeerable)

Proxy предоставляет статические методы для создания динамических прокси-классов и экземпляров, а также является суперклассом всех динамических прокси-классов, созданных этими методами.

Применяется к