|
1. Overview
Java在java.lang.reflect包下,定义了自己的代理。利用这个包下的类,我们可以在运行时动态地创建一个代理类,实现一个或多个接口。并将方法的调用转发到你所指定的类。因为实际代理是在运行时创建的,所以称为:动态代理。
Proxy:完全由java产生的,而且实现了完整的subject接口。
InvocationHandler:Proxy上的任何方法调用都会被传入此类,InvocationHandler控制对RealSubject的访问。
因为Java已经帮助我们创建了Proxy类,我们需要有办法告诉Proxy类你要做什么,我们不能像以前一样把代码写入到Proxy类中,因为 Proxy类不是我们实现的。那么我们应该放在哪里?放在InvocationHandler类中,InvocationHandler类是响应代理的任何调用。我们可以吧InvocationHandler想成是代理收到方法调用后,请求做实际工作的对象。
2. java.lang.reflect.InvocationHandler
被代理实例所实现的一个接口,内部只有一个invoke()方法,签名如下;
Java代码
public Object invoke(Object proxy, Method method, Object[] args)
当代理的方法被调用的时候,代理就会把这个调用转发给InvocationHandler,也就会调用它的invoke()方法。
3. java.lang.reflect.Proxy
提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类,我们经常使用的静态方式是:
Java代码
newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
package com.jelly.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.List;import java.util.Vector;/** * 动态代理 * * @author Jelly QQ136179492 * */public class VectorProxy implements InvocationHandler {private Object object;public VectorProxy(Object obj) {this.object = obj;}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("before calling:" + method);// 当有参数的时候,打印出所有方法if (null != args)for (Object ob : args) {System.out.println(ob);}Object obj = method.invoke(object, args);System.out.println("after calling:" + method);return obj;}public static Object factory(Object obj) {Class<?> classType = obj.getClass();for (Class c : classType.getInterfaces()) {System.out.println("接口" + c.getName());}// 返回动态代理return Proxy.newProxyInstance(classType.getClassLoader(),classType.getInterfaces(), new VectorProxy(obj));}public static void main(String[] args) {List v = (List) factory(new Vector());System.out.println(v.getClass().getName());v.add("new");v.add("york");}} |
|