隨筆-95  評(píng)論-31  文章-10  trackbacks-0
          熟悉代理模式的基礎(chǔ)上,首先使用反射實(shí)現(xiàn)動(dòng)態(tài)調(diào)用某個(gè)對(duì)象的某個(gè)方法,目的就是某個(gè)對(duì)象某個(gè)方法可以進(jìn)行配置,使用XML或者使用后綴名properties文件。
          代碼如下:
            1import java.lang.reflect.Method
            2public class ReflectUtils{
            3     private Class clazz;  //目標(biāo)對(duì)象的類
            4     private Method method; //目標(biāo)對(duì)象的方法
            5     private Object target; //目標(biāo)對(duì)象
            6     private Object[] params; //目標(biāo)方法的參數(shù)
            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;   //綁定目標(biāo)對(duì)象
           13        this.clazz = target.getClass(); //綁定目標(biāo)對(duì)象類
           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); //調(diào)用該方法
           30    }
          catch(Exception e){
           31    }

           32}

           33}

           34下面給出測(cè)試?yán)?br />  35/**
           36 *
           37 * 定義一個(gè)接口
           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 * 接口實(shí)現(xiàn)類
           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 * 定義測(cè)試類
           79 **/

           80public class Test{
           81    private static Crosscutting cut = new Crosscutting(); // 橫切面的東西,可使用ioc進(jìn)行配置
           82    private static ReflectUtils rf_before = new ReflectUtils(cut, "before");
           83    //這個(gè)cut就代表AOP里面的橫切面 before代表織入點(diǎn) 同下
           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();  //使用上面自定義動(dòng)態(tài)代理類調(diào)用橫切面的before方法
           92                        new ReflectUtils(obj, method, params).invokeMethod(); //使用上面的動(dòng)態(tài)代理類調(diào)用核心目標(biāo)方法
           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      //環(huán)繞通知
          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方法測(cè)試
          120public static void main(String[] args) throws Exception{
          121      Crud crud = new CrudImpl(); // 業(yè)務(wù)bean可使用IOC進(jìn)行裝配
          122      UserInfo user = new UserInfo("lx""25"); // 實(shí)體bean可以使用IOC進(jìn)行裝配
          123      // 讀取配置文件 獲得要攔截的方法名字 相當(dāng)于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); //測(cè)試前置通知
          129       afterActive(crud,method,user);//測(cè)試后置通知    
          130//修改parameters.properties文件里面的method名字 比如add modify delete 那么就會(huì)對(duì)方法實(shí)現(xiàn)攔截調(diào)用橫切面的方法 以上純屬自我摸索~
          131}

          132}

          133 
          134}
          主站蜘蛛池模板: 达日县| 溆浦县| 法库县| 沂源县| 高尔夫| 贵定县| 和田市| 沅江市| 正蓝旗| 日照市| 美姑县| 溆浦县| 江门市| 平远县| 龙里县| 高要市| 邳州市| 永年县| 威宁| 岐山县| 天峨县| 莱州市| 邵武市| 七台河市| 永春县| 兴化市| 武威市| 高要市| 新和县| 武清区| 京山县| 清苑县| 巫溪县| 石楼县| 贺州市| 镇雄县| 石家庄市| 庆安县| 多伦县| 巴马| 平遥县|