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

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

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

    隨筆-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 閱讀(4570) 評論(2)  編輯  收藏

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

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


    網站導航:
     
    主站蜘蛛池模板: 韩国日本好看电影免费看| 女人裸身j部免费视频无遮挡| 亚洲午夜精品久久久久久人妖| 国产精品亚洲αv天堂无码| 亚洲精品高清一二区久久| 免费一级毛片不卡在线播放| 成人免费视频国产| 免费国产高清视频| 日韩亚洲精品福利| 亚洲综合精品网站| 亚洲午夜未满十八勿入网站2| 亚洲午夜久久久影院| 久久精品国产精品亚洲艾| 亚洲综合无码一区二区| 亚洲网站在线免费观看| 亚洲AV无码一区二区三区人| 久久久久久亚洲精品影院| 亚洲真人无码永久在线观看| 亚洲a∨国产av综合av下载| 国产成人 亚洲欧洲| caoporm超免费公开视频| 黄色网站软件app在线观看免费| 免费无码又爽又刺激高潮软件| 久久久久久久岛国免费播放| 18女人毛片水真多免费| 成人午夜18免费看| 国产免费一区二区三区VR| 国产精品V亚洲精品V日韩精品| 亚洲国产精品乱码一区二区| 亚洲第一区视频在线观看| 亚洲区日韩精品中文字幕| 无码人妻一区二区三区免费视频 | 亚洲av手机在线观看| 久久亚洲2019中文字幕| 亚洲av日韩av激情亚洲| 亚洲大片免费观看| 狼人大香伊蕉国产WWW亚洲| 9久热精品免费观看视频| 久久九九兔免费精品6| 日日操夜夜操免费视频| 中文字幕亚洲一区二区三区 |