public class Proxy extends Object implements Serializable
Proxy
创建动态代理类的实例提供了静态方法,也是所有动态代理类的父类的方法创建。
创建一个接口Foo
代理:
InvocationHandler处理器=新myinvocationhandler(…);班<?> proxyclass =代理,动态代理类(foo。类。getclassloader(),foo类);Foo f =(Foo)proxyclass。getconstructor(InvocationHandler。类)。newInstance(处理);或者更简单的:
Foo f =(Foo)代理。代理实例(foo。getclassloader()类,新班<?> [ ] { foo.class },处理程序);
空动态代理类(简称为空代理类)是一个类实现的接口列表,指定在运行时创建的类,用行为描述如下。空代理接口是一个接口,由一个代理类实现。空代理实例是代理类的一个实例。每个代理实例有一个相关的零调用处理程序对象,它实现了接口InvocationHandler
。方法调用一个代理实例通过其代理接口将被派遣到该实例的调用处理程序的invoke
方法,通过代理实例,一个java.lang.reflect.Method
对象被调用的方法识别和Object
型含参数数组。调用处理程序以适当的方式处理编码的方法调用,结果返回的结果将作为代理实例的方法调用的结果返回。
代理类具有以下属性:
"$Proxy"
开始空间是应该的,但是,保留代理类。java.lang.reflect.Proxy
。getInterfaces
其类
对象将返回一个数组包含接口相同的列表(在创建时指定的顺序),调用getMethods
其类
对象将返回方法
对象包括所有这些接口方法的数组,和getMethod
会找到方法调用代理接口可以预期。Proxy.isProxyClass
方法将返回true如果是通过一个代理类的Proxy.getProxyClass
或一个对象的类返回的类返回Proxy.newProxyInstance
--否则为假。java.security.ProtectionDomain
是为系统类引导类加载器加载相同,如java.lang.Object
,因为代理类的代码是由受信任的系统代码生成。这个保护域通常会被授予java.security.AllPermission
。InvocationHandler
接口的实现,为一个代理实例的调用处理程序。而不是使用反射API访问公共构造函数,一个代理实例可以通过调用Proxy.newProxyInstance
方法创建,并结合调用构造函数调用句柄调用Proxy.getProxyClass
行动。代理实例具有以下属性:
proxy
和其中一个接口的代理类Foo
实施,下面的表达式将返回true: proxy instanceof Foo
以下铸造操作成功(而不是抛出一个ClassCastException
): (Foo) proxy
Proxy.getInvocationHandler
方法将返回作为参数传递代理实例的调用处理程序。invoke
方法为文档中的说明方法。hashCode
,equals
调用,或toString
方法宣布java.lang.Object
在代理实例将被编码并发送到以相同的方式调用处理程序的invoke
方法作为接口方法调用进行编码和发送,如上面所描述的。声明类的对象传递给invoke
方法
将java.lang.Object
。一个代理实例继承java.lang.Object
其他公共方法不使用代理类中重写,所以这些方法的调用,就像他们做的java.lang.Object
。当一个代理类的两个或多个接口包含相同的名称和参数签名的方法时,代理类的接口的顺序变得显着。当这样的一个空重复方法在代理实例的调用,方法
对象通过调用处理程序不一定是一个声明类转让从接口调用通过代理的方法的引用类型。此限制存在,因为生成的代理类中的相应方法实现不能确定调用的接口是通过。因此,当一个重复的方法是一个代理实例的调用,在包含该方法的最重要的方法
对象接口的方法(直接或通过继承一个超接口)接口的代理类的列表是通过调用处理程序的invoke
方法,无论对引用类型的方法调用发生。
如果一个代理接口包含一个具有相同的名称和参数签名方法为hashCode
,equals
,或toString
方法java.lang.Object
,当这样的一个方法是在一个代理实例的调用,方法
对象通过调用处理程序会有java.lang.Object
作为其声明类。换句话说,公众的java.lang.Object
非final方法在逻辑上先于所有的代理接口,方法
对象通过调用处理程序的确定。
注意,当一个重复的方法分派给调用处理程序,该invoke
方法只能把检查的异常类型是分配到一个异常类型在空全部的代理接口方法的throws
条款,它可以通过调用。如果invoke
方法抛出一个异常,不能分配给任何的异常类型声明的方法,它可以通过调用代理接口,然后选中UndeclaredThrowableException
将通过代理实例的调用抛出。这种限制意味着,并非所有的异常类型getExceptionTypes
上通过调用传递给invoke
方法返回的对象可以被方法
必然成功的invoke
方法。
InvocationHandler
,
Serialized Form
Modifier and Type | Field and Description |
---|---|
protected InvocationHandler |
h
此代理实例的调用处理程序。
|
Modifier | Constructor and Description |
---|---|
protected |
Proxy(InvocationHandler h)
从一个类构造一个新的
Proxy 实例(通常情况下,一个动态代理类)对其调用处理程序指定的值。
|
Modifier and Type | Method and Description |
---|---|
static InvocationHandler |
getInvocationHandler(Object proxy)
返回指定的代理实例的调用处理程序。
|
static 类<?> |
getProxyClass(ClassLoader loader, 类<?>... interfaces)
返回
java.lang.Class 对象的代理类,给出了类装载器和一个阵列的接口。
|
static boolean |
isProxyClass(类<?> cl)
如果指定的类是动态生成的可利用
getProxyClass 法或代理类
newProxyInstance 方法返回true。
|
static Object |
newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)
返回指定的接口,将方法调用指定的调用处理程序的代理类的一个实例。
|
protected InvocationHandler h
protected Proxy(InvocationHandler h)
Proxy
实例(通常情况下,一个动态代理类)对其调用处理程序指定的值。
h
-这个代理实例的调用处理程序
NullPointerException
如果给定调用处理程序,
h
,是
null
。
public static 类<?> getProxyClass(ClassLoader loader, 类<?>... interfaces) throws IllegalArgumentException
java.lang.Class
对象的代理类,给出了类装载器和一个阵列的接口。代理类将由指定的类装载器定义,并将实现所有提供的接口。如果任何给定的接口是非公开的,代理类将是非公开的。如果为相同的接口排列的代理类已被类装入器定义,那么将返回现有的代理类;否则,这些接口的代理类将由类装载器动态生成和定义。
有可能通过Proxy.getProxyClass
参数的一些限制:
interfaces
阵列所有的类
对象必须是类或接口,而不是原始类型。interfaces
阵列没有两元素可能指的是相同的类
对象。cl
i
,下面的表达式必须是真实的:类。forName(即getname(),虚假,CL)= =我
interfaces
数组的大小不能超过65535。如果这些限制被侵犯,Proxy.getProxyClass
将抛出一个IllegalArgumentException
。如果interfaces
数组参数或其任何元素null
,一NullPointerException
将抛出。
请注意,指定的代理接口的顺序是显着的:两个请求的代理类的接口相同的组合,但在一个不同的顺序将导致两个不同的代理类。
loader
的类装载器来定义代理类
interfaces
-为代理类实现的接口列表
IllegalArgumentException
-如果有的话,可以通过
getProxyClass
参数的限制是违反
SecurityException
-如果一个安全经理,是目前任何满足以下条件:
loader
是null
和调用者的类装载器是不null
与RuntimePermission("getClassLoader")
s.checkPermission
调用拒绝访问权限。intf
,调用者的类装载器是不一样的或祖先的intf
和调用s.checkPackageAccess()
类加载器拒绝访问intf
。NullPointerException
-如果
interfaces
数组参数或其任何元素
null
public static Object newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
Proxy.newProxyInstance
抛出IllegalArgumentException
,Proxy.getProxyClass
不一样的原因。
loader
的类装载器来定义代理类
interfaces
-为代理类实现的接口列表
h
-调用处理程序调度方法调用
IllegalArgumentException
-如果有的话,可以通过
getProxyClass
参数的限制是违反
SecurityException
-如果一个安全经理,是目前任何满足以下条件:
loader
是null
和调用者的类装载器是不null
与RuntimePermission("getClassLoader")
s.checkPermission
调用拒绝访问权限;intf
,调用者的类装载器是不一样的或祖先的intf
和调用s.checkPackageAccess()
类加载器拒绝访问intf
;ReflectPermission("newProxyInPackage.{package name}")
s.checkPermission
调用拒绝访问权限。NullPointerException
-如果
interfaces
数组参数或其任何元素
null
,或者调用处理程序,
h
,是
null
public static boolean isProxyClass(类<?> cl)
getProxyClass
法或代理类
newProxyInstance
方法返回true。
这种方法的可靠性,用它来做出安全决策的能力是很重要的,所以它的实施不应只是测试如果类问题延伸Proxy
。
cl
-课堂测试
true
如果类是代理类和
false
否则
null
cl
NullPointerException
public static InvocationHandler getInvocationHandler(Object proxy) throws IllegalArgumentException
proxy
-代理实例返回调用处理程序
IllegalArgumentException
如果参数不是一个代理实例
SecurityException
-如果一个安全经理,是目前和调用者的类装载器是不一样的或祖先的类装载器的调用处理程序和调用
s.checkPackageAccess()
拒绝访问调用处理程序的类。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.