`

动态代理

阅读更多
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");
	}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics