设计模式之动态代理的代码实现(Java)

来源:互联网 发布:摩托罗拉v3ie软件 编辑:程序博客网 时间:2024/05/12 13:46
//首先创建用户的接口与实现方法来进行模拟动态代理的操作//UserDaopackage july.star.proxy; /**  * 用户数据处理接口  * @author MoXingJian  * @email 939697374@qq.com  * @date 2016年12月11日 下午3:30:19  * @version 1.0  */public interface UserDao {     //用户的添删改查     public abstract void add();     public abstract void delete();     public abstract void update();     public abstract void select();     }//接口实现类package july.star.proxy; /**  * UserDaoImpl  * @author MoXingJian  * @email 939697374@qq.com  * @date 2016年12月11日 下午3:31:49  * @version 1.0  */public class UserDaoImpl implements UserDao {     @Override     public void add() {          System.out.println("添加用户");     }     @Override     public void delete() {          System.out.println("删除用户");     }     @Override     public void update() {          System.out.println("修改用户");     }     @Override     public void select() {          System.out.println("查询用户");     }}//InvocationHandler 是代理实例的调用处理程序 实现的接口。package july.star.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * MyInvocationHandler * InvocationHandler 是代理实例的调用处理程序 实现的接口。 * 每个代理实例都具有一个关联的调用处理程序。 * 对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。 * @author MoXingJian * @email 939697374@qq.com * @date 2016年12月11日 下午3:35:41 * @version 1.0 */public class MyInvocationHandler implements InvocationHandler {     private Object target; // 目标对象     // 传进目标对象     public MyInvocationHandler(Object target) {          this.target = target;     }     @Override     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {          //要进行的额外操作          System.out.println("权限校验");          Object object = method.invoke(target, args);          System.out.println("日志记录");          return object;  //返回动态代理对象     }}//测试package july.star.proxy;import java.lang.reflect.Proxy;/** * 动态代理测试 * * @author MoXingJian * @email 939697374@qq.com * @date 2016年12月11日 下午3:32:53 * @version 1.0 */public class ProxyDemo {     public static void main(String[] args) {          UserDao ud = new UserDaoImpl();          //代理前          ud.add();          ud.delete();          ud.update();          ud.select();          //分割线          System.out.println("----------------");          /**           * newProxyInstance(ClassLoader loader, Class<?>[] interfaces,           * InvocationHandler h) 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。           */          MyInvocationHandler mih = new MyInvocationHandler(ud);          // 通过反射获取类加载器和类的所有接口          // 因为传进去的是UserDao,所以返回动态代理对象也是UserDao          UserDao proxy = (UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(), ud.getClass().getInterfaces(),                   mih);          //都给每个方法的前后做了权限校验与日志记录          proxy.add();          proxy.delete();          proxy.update();          proxy.select();     }}

0 0
原创粉丝点击