jdk动态代理快速构造
为什么要使用动态代理
请看下面的实例代码:
通常系统中用户需要crud的时候要判断用户权限添加后需要记录记录日志
public void add() {
//添加前要做一个权限校验
//System.out.println("权限校验");
System.out.println("添加功能");
//添加后要做一个日志记录
//System.out.println("日志记录");
}
测试代码
public class Test{
public static void main(String[] args) {
//UserImpl ui = new UserImpl();
//ui.add();
}
输出:
权限校验
添加功能
日志记录
总结:这样做就要修改源码 如果后面要增加更新更能仍然要修改代码不能这样去做
要增加一个代理对象
代码:
public interface Student {
public void add();
public void delete();
}
public class StudentImpl implements Student {
@Override
public void add() {
System.out.println("同学添加");
}
@Override
public void delete() {
System.out.println("同学删除");
}
}
构造代理对象
public class MyInvocationHandler implements InvocationHandler {
/**
* 要对这个对象进行代理 重写
*/
private Object target;
//被代理的对象
public MyInvocationHandler(Object target) {
super();
this.target = target;
}
/**
* @param proxy 要代理的对象
* @param method 要代理对象的方法 通过反射获得的method
*
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("权限校验");
method.invoke(target, args);//执行被代理target对象的方法
System.out.println("日志记录");
return null;
}
}
测试单元
StudentImpl s = new StudentImpl();
s.add();
s.delete();
System.out.println("-------------------------");
System.out.println("使用代理完成添加删除前的工作");
MyInvocationHandler m = new MyInvocationHandler(s);//s为要代理的对象
//返回的实际是
Student stu = (Student)Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(), m);
第三个参数则为实现了
static Object |
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。 |
stu.add();

浙公网安备 33010602011771号