[size=medium] 今天,自己学习了下javaAPI的动态代理,并查阅了网上的一些关于动态代理的文章。有心把自己的理解写下。
动态代理最重要是有一个Proxy类,还有一个InvocationHandler接口。一般理解了这两个那么对于动态代理应该也就理解了。
Proxy类里面有一个方法是newPorxyInstance(ClassLoader loader,Class<?>[] interfaces , InvocationHandler h) throws IllegalArgumentException.
这个方法是用于创建一个proxy对象,
至于参数loader可以是装载我们的目标类(待会说明)或者目标类所实现的接口的类装载器。
interfaces是我们要创建的那个proxy所要实现的那些接口。
h 则是与我们要创建的这个proxy绑定的执行处理器(InvocationHandler)。
每一个proxy的实例都有一个与之绑定的执行处理器,并且当该proxy执行一个方法的时候,他会把这个方法的执行分配给这个执行处理器的invoke方法去执行。接着就要谈谈执行处理器(InvocationHandler)了。
InvocationHandler接口里面有一个invoke方法。里面的参数我也就不一一说明了,大家可以看看API里面的说明,因为我也是看API的。这篇文章几乎都是API里面的内容。提醒一点就是每一个InvocationHandler的实现类里面都有应该要保留一个目标类的一个引用,以便调用方法的时候可以用到。接下来我用一个实例说明一下。[/size]
[size=medium]下面这个是一个目标类实现了上面的接口。上面提到的loader可以是装在我们这个目标类所使用的classLoader。[/size]
[size=medium]
下面这个类则是用来对从客户端到目标类的额外处理。相当于一个过滤的中间处理层吧。[/size]
[size=medium]
最后我们看看我们的客户端怎样来调用。[/size]
[size=medium]
以下是执行的结果:
I am dreaming ...
I am working hard, working hard, working hard ...
My dream come true ...
如果需要更详细的信息,希望大家参考API。[/size]
动态代理最重要是有一个Proxy类,还有一个InvocationHandler接口。一般理解了这两个那么对于动态代理应该也就理解了。
Proxy类里面有一个方法是newPorxyInstance(ClassLoader loader,Class<?>[] interfaces , InvocationHandler h) throws IllegalArgumentException.
这个方法是用于创建一个proxy对象,
至于参数loader可以是装载我们的目标类(待会说明)或者目标类所实现的接口的类装载器。
interfaces是我们要创建的那个proxy所要实现的那些接口。
h 则是与我们要创建的这个proxy绑定的执行处理器(InvocationHandler)。
每一个proxy的实例都有一个与之绑定的执行处理器,并且当该proxy执行一个方法的时候,他会把这个方法的执行分配给这个执行处理器的invoke方法去执行。接着就要谈谈执行处理器(InvocationHandler)了。
InvocationHandler接口里面有一个invoke方法。里面的参数我也就不一一说明了,大家可以看看API里面的说明,因为我也是看API的。这篇文章几乎都是API里面的内容。提醒一点就是每一个InvocationHandler的实现类里面都有应该要保留一个目标类的一个引用,以便调用方法的时候可以用到。接下来我用一个实例说明一下。[/size]
package com.vocation.test.proxy;
public interface Realizable { //这个接口是目标类和proxy应该共同实现的接口。
public void doThings(String process);
}
package com.vocation.test.proxy;
[size=medium]下面这个是一个目标类实现了上面的接口。上面提到的loader可以是装在我们这个目标类所使用的classLoader。[/size]
public class Target implements Realizable {
@Override
public void doThings(String process) {
System.out.println(process);
}
}
[size=medium]
下面这个类则是用来对从客户端到目标类的额外处理。相当于一个过滤的中间处理层吧。[/size]
package com.vocation.test.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TargetHandler implements InvocationHandler{
private Object target ;//目标类的一个应用以便下面invoke方法中method的invoke方法使用。
public TargetHandler(){
}
public TargetHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("I am dreaming ...");
method.invoke(target, args);
System.out.println("My dream come true ...");
return null;
}
}
[size=medium]
最后我们看看我们的客户端怎样来调用。[/size]
package com.vocation.test.proxy;
import java.lang.reflect.Proxy;
public class StartLife {
public static void main(String [] args) {
//创建一个目标类
Target target = new Target();
//创建一个处理目标类的方法的一个处理器
TargetHandler targetHandler = new TargetHandler(target);
//ClassLoader也可以是装载目标类的装载器,Class数组是要创建的这个proxy实例所要实现的所有接口,InvocationHandler是我们用来处理目标类的处理器。
Realizable realizableTarget = (Realizable)Proxy.newProxyInstance(Realizable.class.getClassLoader(), new Class[] {Realizable.class}, targetHandler);
//直接调用代理类的方法,然后该代理类会把方法的执行分配给其绑定的执行处理器的invoke方法去执行。
realizableTarget.doThings("I am working hard, working hard, working hard ...");
}
}
[size=medium]
以下是执行的结果:
I am dreaming ...
I am working hard, working hard, working hard ...
My dream come true ...
如果需要更详细的信息,希望大家参考API。[/size]