Proxy 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
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
提供了用于创建动态代理类和实例的静态方法,它也是这些方法创建的所有动态代理类的超类。
为某个接口 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 Proxy 类是<>公共的、最终的,而不是 abstract</em>。<></李>
<如果任何代理接口是非公共的,则 li>Proxy 类是 <>em 非公共的、最终的,而不是 abstract</em。<>/李>
<li>代理类的不限定名称未指定。 但是,以字符串 "$Proxy"
开头的类名的空间应保留给代理类。
<li>代理类扩展 java.lang.reflect.Proxy
。
<li>代理类以相同的顺序完全实现在其创建时指定的接口。
<li>如果代理类实现非公共接口,则将在与该接口相同的包中定义该接口。 否则,代理类的包也未指定。 请注意,包密封不会阻止在运行时在特定包中成功定义代理类,并且已由同一类加载程序定义的类和具有特定签名者的同一包也不会阻止代理类。
<由于>代理类实现在其创建时指定的所有接口,对其 对象调用getInterfaces
Class
将返回一个数组,其中包含在其创建) 时指定的顺序 (相同的接口列表,调用getMethods
其 Class
对象将返回包含这些接口中的所有方法的对象数组Method
, 和 调用 getMethod
将在代理接口中按预期方式找到方法。
<li>如果传递代理类(由 返回的类或 -Proxy.getProxyClass
- 返回的对象Proxy.newProxyInstance
类),则Proxy#isProxyClass Proxy.isProxyClass
方法将返回 true,否则返回 false。
<java.security.ProtectionDomain
代理>类的 与 bootstrap 类加载程序(例如 )java.lang.Object
加载的系统类相同,因为代理类的代码由受信任的系统代码生成。 通常会向此保护域授予 java.security.AllPermission
。
<li>每个代理类都有一个公共构造函数,该构造函数采用一个参数(接口 InvocationHandler
的实现)来设置代理实例的调用处理程序。 还可以通过调用 Proxy#newProxyInstance Proxy.newProxyInstance
方法创建代理实例,而无需使用反射 API 访问公共构造函数,该方法将调用 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>代理实例上声明java.lang.Object
的 hashCode
、 equals
或 toString
方法的调用将按照与编码和调度接口方法调用相同的方式编码和调度到调用处理程序的方法invoke
,如上文所述。 传递给 invoke
的 Method
对象的声明类将是 java.lang.Object
。 代理类不会重写从 中继承的 java.lang.Object
代理实例的其他公共方法,因此对这些方法的调用的行为类似于 对 实例的 java.lang.Object
调用。 </ul>
<h3>方法在多个代理接口<中重复/h3>
当代理类的两个或更多个接口包含具有相同名称和参数签名的方法时,代理类接口的顺序会变得很大。 在代理实例上调用此类 重复方法 时, Method
传递给调用处理程序的对象不一定是其声明类可从通过该代理方法调用的接口的引用类型分配的对象。 之所以存在此限制,是因为生成的代理类中的相应方法实现无法确定通过哪个接口调用它。 因此,在代理实例上调用重复方法时, Method
将直接或通过代理类接口列表中的超接口) (包含方法的最重要接口中方法的对象传递给调用处理程序 invoke
的方法,而不考虑方法调用的引用类型。
如果在代理实例上调用此类方法时,代理接口包含与 的 、 或 方法具有相同名称和参数签名hashCode
的方法,则Method
传递给调用处理程序的对象将具有 java.lang.Object
作为其声明类。java.lang.Object
toString
equals
换句话说,公共的非最终方法 java.lang.Object
在逻辑上位于所有代理接口之前,用于确定 Method
要传递给调用处理程序的对象。
另请注意,当将重复方法调度到调用处理程序时, invoke
该方法可能仅引发可分配给该方法子句中 throws
可通过调用该方法 的所有 代理接口中的异常类型的检查异常类型之一。 invoke
如果方法引发一个检查的异常,该异常不能分配给方法在可通过其中一个代理接口中声明的任何异常类型,则代理实例上的调用将引发未选中UndeclaredThrowableException
的。 此限制意味着,方法不一定能够成功invoke
引发通过调用getExceptionTypes
Method
传递给 invoke
方法的对象而返回的所有异常类型。
在 1.3 中添加。
的 java.lang.reflect.Proxy
Java 文档。
此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。
构造函数
Proxy(IInvocationHandler) |
通常,动态代理类 (子类) 其调用处理程序的指定值来构造新 |
Proxy(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
属性
Class |
返回此 |
H |
此代理实例的调用处理程序。 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
JniIdentityHashCode |
|
JniPeerMembers |
|
PeerReference |
|
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不应直接从代码使用。 |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不应直接从代码使用。 |
方法
Clone() |
创建并返回此对象的副本。 (继承自 Object) |
Dispose() |
|
Dispose(Boolean) |
|
Equals(Object) |
指示其他某个对象是否“等于”此对象。 (继承自 Object) |
GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
GetInvocationHandler(Object) |
返回指定代理实例的调用处理程序。 |
GetProxyClass(ClassLoader, Class[]) |
返回 |
IsProxyClass(Class) |
仅当指定类是使用 |
JavaFinalize() |
当垃圾回收确定不再引用对象时,由对象上的垃圾回收器调用。 (继承自 Object) |
NewProxyInstance(ClassLoader, Class[], IInvocationHandler) |
返回指定接口的代理类的实例,该接口将方法调用调度到指定的调用处理程序。 |
Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
ToArray<T>() |
|
ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
UnregisterFromRuntime() |
|
Wait() |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>。<> (继承自 Object) |
Wait(Int64) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
Wait(Int64, Int32) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
显式接口实现
IJavaPeerable.Disposed() |
|
IJavaPeerable.DisposeUnlessReferenced() |
|
IJavaPeerable.Finalized() |
|
IJavaPeerable.JniManagedPeerState |
|
IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
IJavaPeerable.SetPeerReference(JniObjectReference) |
|
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|