动态代理 - 示例1

 示例代码

package DP;

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

interface Dao {

	void save(Emp e);

}

class DaoImpl implements Dao {

	@Override
	public void save(Emp e) {

		System.out.println("save -> " + e);

	}

}

class DaoInvocationHandler1 implements InvocationHandler {

	Dao dao;

	public DaoInvocationHandler1(Dao dao) {
		this.dao = dao;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("DaoInvocationHandler1 - start ");
		method.invoke(dao, args);
		System.out.println("DaoInvocationHandler1 - end ");
		return null;
	}

}

class DaoInvocationHandler2 implements InvocationHandler {

	Dao dao;

	public DaoInvocationHandler2(Dao dao) {
		this.dao = dao;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("DaoInvocationHandler2 - start ");
		method.invoke(dao, args);
		System.out.println("DaoInvocationHandler2 - end ");
		return null;
	}

}

/**
 * 通过铜带代理得方式去拓展方法
 * 
 * @author renguanyu
 *
 */
public class DynamicProxyDemo {

	public static void main(String[] args) {

		// 示例数据
		Emp e = new Emp("1", "liubei");
		// 业务对象
		Dao dao = new DaoImpl();

		// 通过动态代理,拓展方法
		InvocationHandler h = null;

		h = new DaoInvocationHandler1(dao);
		dao = (Dao) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Dao.class }, h);

		h = new DaoInvocationHandler2(dao);
		dao = (Dao) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Dao.class }, h);

		// 业务操作
		dao.save(e);
	}

}

class Emp {

	String id;
	String name;

	public Emp(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return "Emp [id=" + id + ", name=" + name + "]";
	}

}

  

猜你喜欢

转载自www.cnblogs.com/renguanyu/p/12946005.html