<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      使用Java原生代理實現數據注入

      本文由博主原創,轉載請注明出處
      完整源碼下載地址 https://github.com/MatrixSeven/JavaAOP
      上一篇,咱們說了使用Java原生代理實現AOP的簡單例子,然么就不得不說一下Annotation這個東西了.注解(Annotation)是什么.嚇得小柒君趕緊百度下:

      1. 注解基礎知識點
      2. 定義:注解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK1.5及以后版本引入的一個特性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。
        作用分類:
      3. 編寫文檔:通過代碼里標識的元數據生成文檔【生成文檔doc文檔】
      4. 代碼分析:通過代碼里標識的元數據對代碼進行分析【使用反射】
      5. 編譯檢查:通過代碼里標識的元數據讓編譯器能夠實現基本的編譯檢查【Override】

      and so on….如果你對注解(Annotation)還沒有了解請左移百度百科:Annotation和Java 注解
      啊,,是不是很眼熟,這個不就是經常看到的那個@Override神馬的么…原來這個東西就叫做注解啊.
      —–引至百度:我個人使用的理解,annotation是一種在類、類型、屬性、參數、局部變量、方法、構造方法、包、annotation本身等上面的一個附屬品(ElementType這個枚舉中有闡述),他依賴于這些元素而存在,他本身并沒有任何作用,annotation的作用是根據其附屬在這些對象上,根據外部程序解析引起了他的作用,例如編譯時的,其實編譯階段就在運行:java Compiler,他就會檢查這些元素,例如:@SuppressWarnings、@Override、@Deprecated等等;


      的確是,但是想想Spring的IOC依賴注入,控制反轉@xxx(xxx=xxx)然后Bean里就被賦值了,是不是覺得好帥,哈,是不是也覺得好神奇?
      是不是我創建一個注解,然后把他作用到類上就能賦值了?趕緊試一試…

      首先,創建一個注解,用關鍵字@interface來聲明,這是一個注解類.@Target來聲明注解目標,
      @Retention用來說明該注解類的生命周期.

      package proxy.annon;
      import java.lang.annotation.ElementType;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.annotation.Target;
      @Retention(RetentionPolicy.RUNTIME)
      @Target({ElementType.FIELD,ElementType.METHOD})
      public @interface Seven {
          public String value() default "小黑";
          public String Property() default "無屬性";
      }
      

      然后還用咱們昨天的寫的JavaBean,加上注解后的樣子就是:

      package proxy;
      import proxy.annon.Seven;
      import proxy.imp.AnimalInterface;
      public class DogImp implements AnimalInterface {
          @Seven(value = "Lumia")
          private String name;
          private String Property;
          public DogImp() {
          }
          @Override
          public void setName(String name) {
              this.name = name;
          }
          @Override
          public String getName() {
              return this.name;
          }
          @Override
          public void say() {
              System.out.println("小狗:汪汪汪汪.....");
          }
          @Override
          @Seven(Property = "水陸兩棲戰士")
          public void setProperty(String Property) {
              this.Property = Property;
          }
          @Override
          public void getProperty() {
              System.out.println(this.name + this.Property);
          }
      }
      

      迫不及待運行下:

      package proxy;
       
      public class Test {
       
          public static void main(String[] args) {
              DogImp dogImp = new DogImp();
              System.out.println(dogImp.getName());
              dogImp.getProperty();
          }
      }
       
      輸出:
      null
      nullnull
      

      額.好傷心,表示并沒有什么效果,那@的注入到底是怎么實現的呢….

      轉了一圈,還得依賴咱們的反射大軍哈哈…..

      趕緊改造下昨天的Demo,讓其能夠注解..咱們一起來…

      注解已經創建好了,怎么讓咱們的注解產生效果呢,趕緊動手寫個AnnoInjection類.

      用來實現注解的內容的注入..

      但是要注意,讓注如屬性的時候,一定要有對用的get/set方法,如果訪問級別為private則可以直接使用
      屬性的set(obj, value),如果為public,則需要自己獲取方法,然后調用方法的invoke

      package proxy.annon;
       
      import java.lang.reflect.Field;
      import java.lang.reflect.Method;
       
      public class AnnoInjection {
       
          public static Object getBean(Object obj) {
              try {
                  // 獲得類屬性
                  Field f[] = obj.getClass().getDeclaredFields();
                  // 遍歷屬性
                  for (Field ff : f) {
                      // 獲得屬性上的注解
                      Seven s = ff.getAnnotation(Seven.class);
                      if (s != null) {
                          System.err.println("注入" + ff.getName() + "屬性" + "tt" + s.value());
                          // 反射調用public set方法,如果為訪問級別private,那么可以直接使用屬性的set(obj,
                          // value);
                          obj.getClass()
                                  .getMethod("set" + ff.getName().substring(0, 1).toUpperCase() + ff.getName().substring(1),
                                          new Class[] { String.class })
                                  .invoke(obj, s.value());
                      }
                  }
                  // 獲得所有方法
                  Method m[] = obj.getClass().getDeclaredMethods();
                  for (Method mm : m) {
                      // 獲得方法注解
                      Seven s = mm.getAnnotation(Seven.class);
                      if (s != null) {
                          System.err.println("注入" + mm.getName() + "方法" + "t" + s.Property());
                          mm.invoke(obj, s.Property());
                      }
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return obj;
          }
       
      }
      

      這樣呢,就實現了屬性的方法的注入..在哪里調用呢…….

      哦,,查看之前的AnimalFactory代碼,會發現在getAnimalBase里有

      Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                      obj.getClass().getInterfaces(),
                      new AOPHandle(obj,method))
      

      很明顯,咱們的動態代理new AOPHandle(obj,method)時傳入了反射生成obj.然后實現代理攔截直接,
      咱們來先處理這個obj.所以咱們簡單修改下這個就好了
      修改后的樣子:

      /***
           * 獲取對象方法
           * @param obj
           * @return
           */
          private static Object getAnimalBase(Object obj,AOPMethod method){
              //獲取代理對象
              return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                      obj.getClass().getInterfaces(),
                      new AOPHandle(AnnoInjection.getBean(obj),method));
          }
      

      soga….看起來完美了,,趕緊跑起來試一試..

      不對..之前的方法攔截太羅嗦,咱們只攔截getProperty方法..好吧

      要不然輸出太惡心了….

      修改后的AOPTest….

      package proxy;
       
      import java.lang.reflect.Method;
       
      import org.junit.runner.RunWith;
      import org.junit.runners.BlockJUnit4ClassRunner;
      import proxy.imp.AOPMethod;
      import proxy.imp.AnimalInterface;
       
      @RunWith(BlockJUnit4ClassRunner.class)
      public class AOPTest {
       
          public static void main(String[] args) {
       
              AnimalInterface dog = AnimalFactory.getAnimal(DogImp.class, new AOPMethod() {
                  // 這里寫方法執行前的AOP切入方法
                  public void before(Object proxy, Method method, Object[] args) {
                      if (method.getName().equals("getProperty")) {
                          System.err.println("成功攔截" + method.getName() + "方法,啟動");
                      }
                  }
       
                  // 這里系方法執行后的AOP切入方法
                  public void after(Object proxy, Method method, Object[] args) {
                      if (method.getName().equals("getProperty"))
                          System.err.println("成功攔截" + method.getName() + "方法,結束");
       
                  }
              });
              dog.say();
              String name1 = "我的名字是" + dog.getName();
              System.out.println(name1);
              dog.setName("二狗子");
              String name2 = "我的名字是" + dog.getName();
              System.out.println(name2);
              dog.getProperty();
          }
      }
      

      然后給我run起來….

      beauty,成功出來了呢..趕緊上個圖,高興下..

      截圖

      哈哈哈……大家是夠有許多感悟呢,咱們下次再見

      吾愛Java(QQ群):170936712

      posted @ 2017-01-08 12:45  菜狗_無知  閱讀(788)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧洲亚洲国内老熟女超碰| 无码专区人妻系列日韩精品| 亚洲最大av一区二区| 加勒比亚洲视频在线播放| 中文字幕制服国产精品| 91老熟女老人国产老太| 久久精品亚洲精品国产色婷| 蜜芽久久人人超碰爱香蕉 | 国产日韩av一区二区在线| 国产日产亚洲系列av| 内射干少妇亚洲69xxx| 蜜桃av亚洲第一区二区| 91区国产福利在线观看午夜 | 亚洲成a人片在线观看中文 | 国产精品成人免费视频网站京东| 亚洲精品二区在线播放| 国产麻豆成人精品av| 久久亚洲精品国产精品| 高清一区二区三区不卡视频| 国产精品福利自产拍在线观看| 自拍亚洲综合在线精品| 久久精品国产福利亚洲av| 极品人妻少妇一区二区三区| 国产人妻精品午夜福利免费| 无码免费大香伊蕉在人线国产| 一本大道卡一卡二卡三乱码全集资源| 久久综合色一综合色88欧美| 日韩有码国产精品一区| 国产成人精品日本亚洲网站| 国产成人亚洲精品成人区| 欧美野外伦姧在线观看| 日韩精品毛片无码一区到三区| 视频一区二区三区四区不卡 | 亚洲国产成人久久精品软件| 国产精品久久久久久久久久| 欧美牲交a欧美牲交aⅴ图片| 在线中文字幕国产精品| 美女扒开尿口让男人桶| 成年无码av片完整版| 公喝错春药让我高潮| 一本无码av中文出轨人妻|