• 动态代理


     示例代码

      1 package DP;
      2 
      3 import java.lang.reflect.InvocationHandler;
      4 import java.lang.reflect.Method;
      5 import java.lang.reflect.Proxy;
      6 
      7 /**
      8  * 通过动态代理的模式去拓展方法
      9  * 
     10  * @author renguanyu
     11  *
     12  */
     13 public class DynamicProxyDemo {
     14 
     15     public static void main(String[] args) {
     16 
     17         /*
     18         System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
     19         System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");
     20         */
     21 
     22         // 示例数据
     23         Emp e = new Emp("1", "liubei");
     24         // 业务对象
     25         Dao dao = new DaoImpl();
     26 
     27         // 通过动态代理,拓展方法
     28         InvocationHandler h = null;
     29 
     30         h = new DaoInvocationHandler1(dao);
     31         dao = (Dao) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Dao.class }, h);
     32 
     33         h = new DaoInvocationHandler2(dao);
     34         dao = (Dao) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Dao.class }, h);
     35 
     36         // 业务操作
     37         dao.save(e);
     38     }
     39 
     40 }
     41 
     42 interface Dao {
     43 
     44     void save(Emp e);
     45 
     46 }
     47 
     48 class DaoImpl implements Dao {
     49 
     50     @Override
     51     public void save(Emp e) {
     52 
     53         System.out.println("save -> " + e);
     54 
     55     }
     56 
     57 }
     58 
     59 class DaoInvocationHandler1 implements InvocationHandler {
     60 
     61     Dao dao;
     62 
     63     public DaoInvocationHandler1(Dao dao) {
     64         this.dao = dao;
     65     }
     66 
     67     @Override
     68     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     69         System.out.println("DaoInvocationHandler1 - start ");
     70         method.invoke(dao, args);
     71         System.out.println("DaoInvocationHandler1 - end ");
     72         return null;
     73     }
     74 
     75 }
     76 
     77 class DaoInvocationHandler2 implements InvocationHandler {
     78 
     79     Dao dao;
     80 
     81     public DaoInvocationHandler2(Dao dao) {
     82         this.dao = dao;
     83     }
     84 
     85     @Override
     86     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     87         System.out.println("DaoInvocationHandler2 - start ");
     88         method.invoke(dao, args);
     89         System.out.println("DaoInvocationHandler2 - end ");
     90         return null;
     91     }
     92 
     93 }
     94 
     95 class Emp {
     96 
     97     String id;
     98     String name;
     99 
    100     public Emp(String id, String name) {
    101         super();
    102         this.id = id;
    103         this.name = name;
    104     }
    105 
    106     @Override
    107     public String toString() {
    108         return "Emp [id=" + id + ", name=" + name + "]";
    109     }
    110 
    111 }
  • 相关阅读:
    Linux——shell简单学习(一)
    Linux——进程管理简单学习笔记(二)
    Linux——进程管理学习简单笔记
    Linux——用户管理简单学习笔记(四)
    PHP计算程序运行时间的类
    php几个常用的概率算法(抽奖、广告首选)
    限制非安全IP访问
    简单的点击短信发送计时器
    php 以图搜图
    递归获取二维数组后代、删除后代
  • 原文地址:https://www.cnblogs.com/renguanyu/p/12946005.html
Copyright © 2020-2023  润新知