隨筆-126  評論-247  文章-5  trackbacks-0

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

          獲得 Class 類型 的幾種方法:

              1. 類名.class

              2. 對象名.getClass()

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


          構造方法的反射:


          package test;

          import java.lang.reflect.Constructor;
          /**
           * -----------------------------------------
           * @描述  反射基礎
           * @作者  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");
                      
          //取得類中參數為String類型的構造器
                      Constructor<?> constructor = clazz.getConstructor(String.class);
                      
          //使用構造器創建一個實例對象
                      Object obj = constructor.newInstance("10");
                      
          //打印結果
                      System.out.println(obj);
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  }
              }
              
          }

          后臺打印輸出結果:


          10


          成員變量的反射:


          package test;

          import java.lang.reflect.Field;

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

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

          后臺打印輸出結果:


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


          成員方法的反射:


          package test;

          import java.lang.reflect.Method;

          /**
           * -----------------------------------------
           * @描述  反射基礎
           * @作者  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);
                      
          //調用該方法
                      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);
              }
          }

          后臺打印輸出結果:


          Arg is String, value is fancy



          For a simple example:

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


          個人分析:泛型的類型檢查只存在編譯期間,運行期間并不存在泛型類型,可以用反射來實現題設要求


          package examination.topic_04;

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

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

              
          public static void main(String[] args){
              
                  
          /**
                   * 泛型的類型檢查只存在編譯期間,運行期間并不存在泛型類型,可以用反射來實現題設要求
                   
          */
                  
          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();
                  }
                  
              }
              
          }

          后臺打印輸出結果:


          fancy


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

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

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 方正县| 长宁区| 河西区| 潮安县| 武邑县| 南木林县| 广丰县| 安西县| 阳城县| 开封县| 九龙坡区| 乐都县| 体育| 襄垣县| 连江县| 东阳市| 北安市| 招远市| 江源县| 保德县| 尖扎县| 青神县| 湘阴县| 晋江市| 石楼县| 洛浦县| 新宁县| 宝应县| 古浪县| 新干县| 隆尧县| 公安县| 博乐市| 广德县| 东兰县| 育儿| 任丘市| 泰宁县| 安徽省| 丹阳市| 闵行区|