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 类是 <em>public、final 和 not abstract</em> (如果所有代理接口都是公共的)。</li>
<li>代理类是 <em>非公共的,最终的,而不是抽象</em> (如果任何代理接口为非公共接口)。</li>
<li>代理类的非限定名称未指定。 但是,应为代理类保留以字符串 "$Proxy" 开头的类名的空间。
<li>A 代理类扩展 java.lang.reflect.Proxy。
<li>A 代理类按相同的顺序实现在其创建时指定的接口。
<li>如果代理类实现非公共接口,则会在与该接口相同的包中定义该接口。 否则,代理类的包也未指定。 请注意,包密封不会阻止代理类在运行时在特定包中成功定义,并且同一类加载程序已定义的类以及具有特定签名者的同一包也不会阻止代理类。
<li>由于代理类实现在其创建时指定的所有接口,因此getInterfacesClass在其对象上调用将返回包含相同接口列表的数组(在其创建时指定的顺序),getMethods调用其Class对象将返回一个对象数组Method,这些接口中包含所有方法,并且调用getMethod将在代理接口中找到方法,如预期的那样。
<
Proxy#isProxyClass Proxy.isProxyClass如果>传递代理类(由代理类返回Proxy.getProxyClass的类或返回Proxy.newProxyInstance的对象类),则该方法将返回 true,否则返回 false。
<li>代理 java.security.ProtectionDomain 类与启动类加载程序加载的系统类相同,例如 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声明的方法hashCodeequalstoString的调用将以与接口方法调用相同的方式编码和调度到调用处理程序invoke的方法,如上文所述。 传递给invoke对象的Method声明类将是 java.lang.Object。 从中继承的 java.lang.Object 代理实例的其他公共方法不会由代理类重写,因此对这些方法的调用的行为与它们对实例 java.lang.Object的行为类似。
</ul>
<多个代理接口</h3 中重复的 h3>方法>
当代理类的两个或多个接口包含具有相同名称和参数签名的方法时,代理类的接口顺序变得重要。 在代理实例上调用此类 重复方法 时, Method 传递给调用处理程序的对象不一定是可从代理方法调用的接口的引用类型分配声明类的对象。 存在此限制,因为生成的代理类中的相应方法实现无法确定通过哪个接口调用。 因此,在代理实例上调用重复方法时, Method 在代理类的接口列表中包含方法(直接或通过超接口继承)的方法的对象将传递给调用处理程序 invoke 的方法,而不考虑方法调用的引用类型。
如果代理接口包含的方法的名称和参数签名与hashCodeequalsjava.lang.ObjecttoString在代理实例Method上调用此类方法时的名称和参数签名相同,则传递给调用处理程序的对象将java.lang.Object作为其声明类。 换句话说,公共的非最终方法 java.lang.Object 在逻辑上位于所有代理接口之前,用于确定要 Method 传递给调用处理程序的对象。
另请注意,当将重复方法调度到调用处理程序时,该方法invoke可能只引发可分配给该方法子句中所有代理接口中throws可调用的异常类型的检查异常类型之一。
invoke如果该方法引发一个检查的异常,该异常类型不可分配给该方法在一个代理接口中声明的异常类型,则代理实例上的调用将引发未选中UndeclaredThrowableException的异常。 此限制意味着,不是通过调用getExceptionTypesMethod传递给invoke方法的对象返回的所有异常类型都必须由invoke该方法成功引发。
已在 1.3 中添加。
Java文档java.lang.reflect.Proxy。
本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。
构造函数
| 名称 | 说明 |
|---|---|
| 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, Int32) |
使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。 (继承自 Object) |
| Wait(Int64) |
使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。 (继承自 Object) |
显式接口实现
| 名称 | 说明 |
|---|---|
| IJavaPeerable.Disposed() |
|
| IJavaPeerable.DisposeUnlessReferenced() |
|
| IJavaPeerable.Finalized() |
|
| IJavaPeerable.JniManagedPeerState |
|
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
| IJavaPeerable.SetPeerReference(JniObjectReference) |
|
扩展方法
| 名称 | 说明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
获取实例 |
| JavaAs<TResult>(IJavaPeerable) |
尝试强制 |
| JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
尝试强制 |