设计模式之 动态代理

来源:互联网 发布:话不多但语出惊人知乎 编辑:程序博客网 时间:2024/05/16 05:22

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

 

 

public class SecurityHandler implements InvocationHandler {

 

  private Object targetObject;

 

  /*targetObjet 为要实例的JAVA, 在这里指的就是 UserManagerImpl

  调用代码写法:  

      SecurityHandler handler = new SecurityHandler();

     UserManager userManager = (UserManager)handler.newProxy(new UserManagerImpl());

     userManager.deleteUser(1);  

  

    在调用的时候,userManager 已经是个代理的类,调用里面的deletUser()方法时,他就会去调用invoke()方法

  */

 

 public Object newProxy(Object targetObject) {

  this.targetObject = targetObject;

  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),

           targetObject.getClass().getInterfaces(),

           this);

 }

 

 

public Object invoke(Object proxy, Method method, Object[] args)

   throws Throwable {

     

  checkSecurity();                  //  关注点的具体实现  里面可以书写任何的检验代码

 

  Object ret = null;

  try {

   ret = method.invoke(this.targetObject, args);  

  }catch(Exception e) {

   e.printStackTrace();

   throw new java.lang.RuntimeException(e);

  }

  return ret;

 }

 

 

 private void checkSecurity() {

   //相应个性化的代码

  System.out.println("----------checkSecurity()---------------");

 }

 

}

 

 

说明:

 1.  newProxy(Object targetObject) 是用来获得一个代理实例

 2.  UserManagerImpl()  是自己写的一个类, 我们现在对它生成代理
 3.  invoke()  调用生成代理类调用它的方法,它调用了这个方法

 4 checkSecurity()  这是一个自己定义的一个方法:例如:登录验证不影响业务逻辑的功能代码