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();

 

posted @ 2018-02-24 14:08  老鱼SOHO  阅读(128)  评论(0)    收藏  举报