<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-95  評論-31  文章-10  trackbacks-0
    熟悉代理模式的基礎上,首先使用反射實現動態調用某個對象的某個方法,目的就是某個對象某個方法可以進行配置,使用XML或者使用后綴名properties文件。
    代碼如下:
      1import java.lang.reflect.Method
      2public class ReflectUtils{
      3     private Class clazz;  //目標對象的類
      4     private Method method; //目標對象的方法
      5     private Object target; //目標對象
      6     private Object[] params; //目標方法的參數
      7 
      8     public ReflectUtils(Object targer,String methodName,Object params){
      9         locateTarget(target,methodName,params);
     10     }

     11     public void locateTarget(Object target,String methodName,Object params){
     12        this.target = target;   //綁定目標對象
     13        this.clazz = target.getClass(); //綁定目標對象類
     14        locateMethod(methodName,params);
     15     }

     16     public void locateMethod(String methodName,Object params){
     17        this.params=params;
     18        Class[] cls = new Class[params.length()];
     19        for(int i=0;i<params.length;i++){
     20             cls[i]=params[i].getClass();
     21        }

     22    try{
     23        this.method = clazz.getMethod(methodName,cls); //組裝好該方法類
     24    }
    catch(Exception e){
     25    }
        
     26}

     27     public void invokeMethod(){
     28try{
     29        this.method.invoke(target,params); //調用該方法
     30    }
    catch(Exception e){
     31    }

     32}

     33}

     34下面給出測試例子
     35/**
     36 *
     37 * 定義一個接口
     38 **/

     39public interface Crud{
     40     public void add(UserInfo user);
     41     public void modify(UserInfo user);
     42     public void delete(UserInfo user);
     43}

     44/**
     45 *
     46 * 接口實現類
     47 **/

     48public CrudImpl implements Crud{
     49     public void add(UserInfo user){
     50     System.out.println("新增用戶:"+new UserInfo("lx","25").getName());
     51     }

     52     public void modify(UserInfo user){
     53     System.out.println("修改用戶:"+new UserInfo("lx","25").getName());
     54     }

     55     public void delete(UserInfo user){
     56     System.out.println("刪除用戶:"+new UserInfo("lx","25").getName());
     57     }

     58}

     59/**
     60 *
     61 * 定義橫向切面的類
     62 **/

     63public class Crosscutting{
     64   public void before(){
     65   System.out.println("前置");
     66   }

     67   public void after(){
     68   System.out.println("后置");
     69   }

     70}

     71/**
     72 *
     73 * 定義配置文件,使用parameters.properties文件
     74 **/

     75method=modify
     76/**
     77 *
     78 * 定義測試類
     79 **/

     80public class Test{
     81    private static Crosscutting cut = new Crosscutting(); // 橫切面的東西,可使用ioc進行配置
     82    private static ReflectUtils rf_before = new ReflectUtils(cut, "before");
     83    //這個cut就代表AOP里面的橫切面 before代表織入點 同下
     84    private static ReflectUtils rf_after = new ReflectUtils(cut, "after");
     85    //前置通知
     86    public void beforeActive(Object target,String methodName,object params){
     87             Class cls = target.getClass();
     88             Method[] methods = cls.getDeclaredMethods();
     89             for(int i=0;i<methods.length;i++){
     90                   if (methods[i].getName().equals(method)) {
     91                        rf_before.invokeMethod();  //使用上面自定義動態代理類調用橫切面的before方法
     92                        new ReflectUtils(obj, method, params).invokeMethod(); //使用上面的動態代理類調用核心目標方法
     93                   }

     94             }

     95     }

     96      //后置通知
     97      public static void afterActive(Object obj, String method, Object params) {
     98             Class cls = obj.getClass();
     99             Method[] methods = cls.getDeclaredMethods();
    100             for (int i = 0; i < methods.length; i++{
    101                    if (methods[i].getName().equals(method)) {
    102                    new ReflectUtils(obj, method, params).invokeMethod();
    103                    rf_after.invokeMethod();
    104                   }

    105              }

    106      }

    107      //環繞通知
    108     public static void aroundActive(Object obj, String method, Object params){
    109             Class cls = obj.getClass();
    110             Method[] methods = cls.getDeclaredMethods();
    111             for (int i = 0; i < methods.length; i++{
    112                    if (methods[i].getName().equals(method)) {
    113                     rf_before.invokeMethod();
    114                     new ReflectUtils(obj, method, params).invokeMethod();
    115                     rf_after.invokeMethod();
    116                     }

    117             }

    118      }

    119//main方法測試
    120public static void main(String[] args) throws Exception{
    121      Crud crud = new CrudImpl(); // 業務bean可使用IOC進行裝配
    122      UserInfo user = new UserInfo("lx""25"); // 實體bean可以使用IOC進行裝配
    123      // 讀取配置文件 獲得要攔截的方法名字 相當于XML
    124       InputStream is = Test.class.getResourceAsStream("parameters.properties");
    125       Properties props = new Properties();
    126       props.load(is);
    127       String method = props.getProperty("method");
    128       beforeActive(crud,method,user); //測試前置通知
    129       afterActive(crud,method,user);//測試后置通知    
    130//修改parameters.properties文件里面的method名字 比如add modify delete 那么就會對方法實現攔截調用橫切面的方法 以上純屬自我摸索~
    131}

    132}

    133 
    134}
    posted on 2010-08-19 10:33 朔望魔刃 閱讀(498) 評論(0)  編輯  收藏 所屬分類: 設計模式&&數據結構
    主站蜘蛛池模板: 久久精品亚洲精品国产色婷 | 国产精品视_精品国产免费| 亚洲1234区乱码| 亚洲一区二区免费视频| 91免费人成网站在线观看18| 亚洲人成网站影音先锋播放| 一进一出60分钟免费视频| 最近高清国语中文在线观看免费| 久久亚洲国产午夜精品理论片| 成人免费无码H在线观看不卡| 最好免费观看韩国+日本 | 日本高清免费网站| 青青青亚洲精品国产| 四虎影视在线永久免费看黄| 色噜噜狠狠色综合免费视频| 国产一级一片免费播放i| 国产亚洲综合精品一区二区三区| 免费h黄肉动漫在线观看| 免费夜色污私人影院网站| 亚洲国产成人精品女人久久久| 一个人免费观看www视频| 亚洲人成影院在线无码按摩店| 国产亚洲人成在线播放| 九月婷婷亚洲综合在线| www成人免费观看网站| 亚洲人精品午夜射精日韩| 99精品在线免费观看| 亚洲午夜福利AV一区二区无码| 日韩精品无码免费专区午夜| 亚洲福利在线观看| 怡红院免费全部视频在线视频| 亚洲av伊人久久综合密臀性色| 91嫩草免费国产永久入口| 亚洲精品乱码久久久久蜜桃| 国产在线观看麻豆91精品免费| 亚洲国产熟亚洲女视频| 国产成人免费a在线资源| 国产精品无码免费专区午夜| av无码东京热亚洲男人的天堂| 精品久久久久久国产免费了| 亚洲国产成人私人影院|