隨筆-126  評(píng)論-247  文章-5  trackbacks-0

          反射的基石是 Class 類,Class 類代表的是 java 源文件通過(guò)編譯后得到的字節(jié)碼,

          獲得 Class 類型 的幾種方法:

              1. 類名.class

              2. 對(duì)象名.getClass()

              3. Class.forName("類路徑")


          構(gòu)造方法的反射:


          package test;

          import java.lang.reflect.Constructor;
          /**
           * -----------------------------------------
           * @描述  反射基礎(chǔ)
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-24 <p>
           * -----------------------------------------
           
          */
          public class ReflectApp {

              
          public static void main(String[] args){
                  
                  
          try {
                      
          //取得Class
                      Class<?> clazz = Class.forName("java.lang.Integer");
                      
          //取得類中參數(shù)為String類型的構(gòu)造器
                      Constructor<?> constructor = clazz.getConstructor(String.class);
                      
          //使用構(gòu)造器創(chuàng)建一個(gè)實(shí)例對(duì)象
                      Object obj = constructor.newInstance("10");
                      
          //打印結(jié)果
                      System.out.println(obj);
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  }
              }
              
          }

          后臺(tái)打印輸出結(jié)果:


          10


          成員變量的反射:


          package test;

          import java.lang.reflect.Field;

          /**
           * -----------------------------------------
           * @描述  反射基礎(chǔ)
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-24 <p>
           * -----------------------------------------
           
          */
          public class ReflectApp {

              
          public static void main(String[] args){
                  
                  
          try {
                      
          //創(chuàng)建一個(gè)Person實(shí)例對(duì)象
                      Person person = new ReflectApp().new Person();
                      
          //取得Class
                      Class<?> clazz = person.getClass();
                      
          /******** 通過(guò)反射訪問(wèn) public 權(quán)限的屬性變量 ********/
                      
          //取得字段的屬性名
                      Field age = clazz.getDeclaredField("age");
                      
          //設(shè)置該屬性的值
                      age.set(person, 22);
                      
                      
          /******* 通過(guò)反射訪問(wèn) protected 權(quán)限的屬性變量 *******/
                      Field mail 
          = clazz.getDeclaredField("mail");
                      mail.set(person, 
          "fancydeepin@yeah.net");
                      
                      
          /******** 通過(guò)反射訪問(wèn) private 權(quán)限的屬性變量 ********/
                      Field name 
          = clazz.getDeclaredField("name");
                      
          //private修飾的變量不能直接訪問(wèn),如需訪問(wèn)必須要將setAccessible的值設(shè)置成true,也就是強(qiáng)制訪問(wèn),或者說(shuō)是暴力訪問(wèn)
                      name.setAccessible(true);
                      name.set(person, 
          "fancy");
                      System.out.println(person);
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  }
              }
              
              
          //內(nèi)部類
              public class Person {

                  
          public    int age;
                  
          private   String name;
                  
          protected String mail;
                  
                  
          public int getAge() {
                      
          return age;
                  }
                  
                  
          public String getName() {
                      
          return name;
                  }
                  
                  
          public void setAge(int age) {
                      
          this.age = age;
                  }
                  
                  
          public void setName(String name) {
                      
          this.name = name;
                  }

                  
          public String getMail() {
                      
          return mail;
                  }

                  
          public void setMail(String mail) {
                      
          this.mail = mail;
                  }

                  @Override
                  
          public String toString() {
                      
                      
          return "Name is:" + name + ",\t Age is:" + age + ",\t Mail is:" + mail;
                  }
                  
              }
          }

          后臺(tái)打印輸出結(jié)果:


          Name is:fancy,     Age is:
          22,     Mail is:fancydeepin@yeah.net


          成員方法的反射:


          package test;

          import java.lang.reflect.Method;

          /**
           * -----------------------------------------
           * @描述  反射基礎(chǔ)
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-24 <p>
           * -----------------------------------------
           
          */
          public class ReflectApp {

              
          public static void main(String[] args){
                  
                  
          try {
                      
          //取得Class
                      Class<?> clazz = Class.forName("test.ReflectApp");
                      
          //取得方法
                      Method method = clazz.getDeclaredMethod("print", String.class);
                      
          //調(diào)用該方法
                      method.invoke(clazz.newInstance(), "fancy");
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  }
              }
              
              
          public void print(int arg){
                  System.out.println(
          "Arg is int, value is " + arg);
              }
              
              
          public void print(String arg){
                  System.out.println(
          "Arg is String, value is " + arg);
              }
          }

          后臺(tái)打印輸出結(jié)果:


          Arg is String, value is fancy



          For a simple example:

          題:ArrayList<Integer> list = new ArrayList<Integer>(); 在這個(gè)泛型為 Integer 的 ArrayList 中存放一個(gè) String 類型的對(duì)象。


          個(gè)人分析:泛型的類型檢查只存在編譯期間,運(yùn)行期間并不存在泛型類型,可以用反射來(lái)實(shí)現(xiàn)題設(shè)要求


          package examination.topic_04;

          import java.lang.reflect.Method;
          import java.util.ArrayList;

          /**
           * -----------------------------------------
           * @描述  測(cè)試類
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-24 <p>
           * -----------------------------------------
           
          */
          /**
           * TOPIC:ArrayList<Integer> list = new ArrayList<Integer>(); 在這個(gè)泛型為Integer的ArrayList中存放一個(gè)String類型的對(duì)象。
           
          */
          public class TestApp {

              
          public static void main(String[] args){
              
                  
          /**
                   * 泛型的類型檢查只存在編譯期間,運(yùn)行期間并不存在泛型類型,可以用反射來(lái)實(shí)現(xiàn)題設(shè)要求
                   
          */
                  
          try {
                      ArrayList
          <Integer> list = new ArrayList<Integer>();
                      Method add 
          = ArrayList.class.getDeclaredMethod("add", Object.class);
                      add.invoke(list, 
          "fancy");
                      System.out.println(list.get(
          0));
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  }
                  
              }
              
          }

          后臺(tái)打印輸出結(jié)果:


          fancy


            
          posted on 2012-08-24 12:34 fancydeepin 閱讀(4572) 評(píng)論(2)  編輯  收藏

          評(píng)論:
          # re: java 反射(Reflect) 2012-08-30 14:50 | 天津花卉
          反射型的還不錯(cuò)  回復(fù)  更多評(píng)論
            
          # re: java 反射(Reflect) 2012-09-14 10:56 | 胖子胖子
          最近在看commons-beanutils,感覺(jué)很不錯(cuò)  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 定安县| 衡南县| 建湖县| 河东区| 蛟河市| 洪泽县| 凭祥市| 定襄县| 开平市| 静乐县| 沂南县| 罗江县| 桑日县| 隆昌县| 垫江县| 沙坪坝区| 班戈县| 彭山县| 十堰市| 泰宁县| 翼城县| 神木县| 曲麻莱县| 平南县| 柳江县| 合肥市| 精河县| 芒康县| 南陵县| 渝中区| 靖江市| 蒲江县| 额济纳旗| 楚雄市| 拜城县| 商丘市| 扶绥县| 阳山县| 琼海市| 英德市| 襄城县|