动态代理Proxy

/*
 * 动态代理:
 * JDK提供Proxy类:代理类,在程序执行过程中产生一个代理类
 * 
 * CGLib动态代理
 * 
 * 改进:需要在添加、删除、查找、修改用户之前进行权限校验,
 * 操作完毕之后还需要产生日志记录
 * 
 * 真实角色:只专注于增删查改的操作,将权限校验,产生日志记录让代理类来进行实现
 * 
 * java.lang.reflect :通过反射,让程序在运行中产生一个代理角色
 * 
 * public static Object newProxyInstance(ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)
                               throws IllegalArgumentException
   该方法的返回值就是代理类的实例
   参数1:代理类的加载器
   参数2:代理类实现接口的列表
   参数3:代理类的指派的处理程序InvocationHandler   
   Object invoke(Object proxy,Method method,Object[] args)throws Throwable
    返回值就是代理类实例
    参数1:代理类实例
    参数2:代表被代理的成员方法
    参数3:被代理成员方法的实际参数
 * */

public class UserTest {
	public static void main(String[] args) {
//		在没有使用动态代理之前
//		传统方式创建对象--->比较耗费资源
//		传统代理方式产生一个实例
		UserDao ud=new UserDaoImpl();//接口多态:接口指向子实现类名
		ud.add();
		ud.delete();
		ud.updata();
		ud.find();
//		优化
		System.out.println("----------");
		UserDao ud2=new UserDaoImpl2();
		ud2.add();
		System.out.println("---");
		ud2.delete();
		System.out.println("---");
		ud2.find();
		System.out.println("---");
		ud2.updata();
		
		System.out.println("-----------------");
		
//		需要针对ud(UserDao)这个对象产生一个代理类(代理类角色)
//		参数1:目标对象的类加载器
//		参数2:目标对象的接口列表
		MyInvocationHandler my=new MyInvocationHandler(ud);
		
		UserDao proxy=(UserDao)Proxy.newProxyInstance(ud.getClass().getClassLoader(), 
				ud.getClass().getInterfaces(),my );
		proxy.add();
		proxy.delete();
		proxy.find();
		proxy.updata();
	}
}
/*
 * 针对用户提供的操作接口
 * 增删查改
 * */
public interface UserDao {
	void add();//隐藏public abstract
	void delete();
	void find();
	void updata();
}
/*
 * 针对用户接口的实现层
 * */
public class UserDaoImpl implements UserDao {

	@Override
	public void add() {
		System.out.println("添加");
	}

	@Override
	public void delete() {
		System.out.println("删除");
	}

	@Override
	public void find() {
		System.out.println("查找");
	}

	@Override
	public void updata() {
		System.out.println("修改");
	}

}
public class UserDaoImpl2 implements UserDao {

	@Override
	public void add() {
		System.out.println("权限校验");
		System.out.println("添加用户");
		System.out.println("产生记录");
	}

	@Override
	public void delete() {
		System.out.println("权限校验");
		System.out.println("添加用户");
		System.out.println("删除");
	}

	@Override
	public void find() {
		System.out.println("权限校验");
		System.out.println("添加用户");
		System.out.println("删除");
	}

	@Override
	public void updata() {
		System.out.println("权限校验");
		System.out.println("添加用户");
		System.out.println("修改");
	}

}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//自定义一个类实现代理的处理程序
public class MyInvocationHandler implements InvocationHandler {
	//目标对象:对谁产生代理
	private Object target;
	public MyInvocationHandler(Object target) {//UserDao ud 目标对象
		this.target=target;
	}

//	针对代理角色完成权限校验以及产生日志记录的功能
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("权限校验");
//		调用ud目标对象中的方法(增删查改)
		Object obj=method.invoke(target, args);
		System.out.println("产生日志记录");
		return obj;//返回目标对象的代理类
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值