JDK动态代理

阅读更多

        JDK 1.3以后提供了动态代理的技术,

JDK

的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中

InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一

起。

     而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。


        上代码:三个类Client、InvocationHandlerObject、ProxyFactory


     1. InvocationHandlerObject类,继承InvocationHandler接口,实现invoke方法。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 实现一个接口InvocationHandler,让这个新的代理去调用 
 * @author wee
 *
 */
public class InvocationHandlerObject implements InvocationHandler {
	Object acturyObj;

	InvocationHandlerObject(Object o) {
		acturyObj = o;
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out
				.println("InvocationHandlerObject.invoke()....................... ");
		pre();
		if (args != null) {
			System.out.println(" args.length " + args.length + "    ");
			for (int i = 0; i < args.length; i++) {
				System.out.println(args[i]);
			}
		}
		// 这里,有几个对象/类的关系要搞清楚
		// acturyObj 是被代理的对象
		// proxy 是动态生成的代理对象
		// InvocationHandlerObject 是被proxy对象调用的,同时它有调用 acturyObj
		// proxy --> InvocationHandlerObject --> acturyObj
		System.out.println("Action method " + method.getName());
		System.out.println("acturyObj" + acturyObj.getClass());
		System.out.println("proxy" + proxy.getClass());

		Object mo = method.invoke(acturyObj, args);
		post();
		System.out
				.println("InvocationHandlerObject.invoke()....................... ");
		return mo;
	}

	public void pre() {
		System.out.println("InvocationHandlerObject.pre()");
	}

	public void post() {
		System.out.println("InvocationHandlerObject.post()");
	}

}

 

        2. ProxyFactory类,产生proxy实例。

import java.lang.reflect.Proxy;

/**
 * .定义一个工厂,其实本质上就是利用这个方法Proxy.newProxyInstance() 产生一个Proxy实例
 * @author wee
 *
 */
public class ProxyFactory {
	Object factory(Object obj) {
		Class cls = obj.getClass();
		return Proxy.newProxyInstance(cls.getClassLoader(),
				cls.getInterfaces(), new InvocationHandlerObject(obj));
	}
}

         3. Client类,测试用。

import java.util.List;
import java.util.Vector;

public class Client {
	public static void main(String[] args) {
		List list = (List) new ProxyFactory().factory(new Vector(10));
		list.add("add method in list 1");
	}
}

你可能感兴趣的:(JDK,Java)