JAVA反射其實就是那麼一回事

來源:互聯網
上載者:User

標籤:

什麼是反射

  java反射機制: JAVA反射機制是在運行狀態中,

          對於任意一個類,都能夠知道這個類的所有屬性和方法;

          對於任意一個對象,都能夠調用它的任意一個方法和屬性;

         這種動態擷取的資訊以及動態調用對象的方法的功能稱為java語言的反射機制。

  簡而言之: 就是根據一個已經執行個體化了的對象來還原類的完整資訊

 

通過反射修改屬性

package Test2016.demo;import java.lang.reflect.Field;public class Demo4 {    public static void main(String[] args) throws Exception {                Student stu = new Student();        Field[] fields = stu.getClass().getDeclaredFields();                for (Field f : fields) {            f.setAccessible(true);  //設定是否允許訪問,不寫運行會報錯                        if (f.getName() == "name") {                f.set(stu, "java");            } else if (f.getName() == "age") {                f.set(stu, 20);            }        }        System.out.println(stu);    //輸出:java:20    }}class Student {        private String name;        private int age;        public Student() {        this.name = "zhangsan";        this.age = 10;    }        //重寫toString方法,否則輸出:[email protected]    public String toString() {        return this.name + ":" + this.age;    }}

 

通過反射調用方法

package Test2016.demo;import java.lang.reflect.Method;public class Demo4 {    @SuppressWarnings("unchecked")    public static void main(String[] args) throws Exception {                Student stu = new Student("zhangsan", 21);                Class c = stu.getClass();                //getMethod()方法需要傳入方法名和方法所帶參數的參數類型        Method method = c.getMethod("score", int.class);                //invoke()表示調用的意思,需要傳入對象和參數        method.invoke(stu, 100);                Method m = c.getMethod("say", String.class);        //這裡的null表示不由對象調用,也就是靜態方法,把null換位stu也是可行的        m.invoke(null, "hello java!!!");    }}class Student {        private String name;        private int age;        public Student(String name, int age) {        this.name = name;        this.age = age;    }        public void score(int score) {        System.out.println(this.name + " 考了 " + score + " 分");    }        public static void say(String str) {        System.out.println("剛才我說了:" + str);    }        @Override    public String toString() {        return this.name + "-" + this.age;    }}

 程式輸出:  zhangsan 考了 100 分
       剛才我說了:hello java!!!

 

通過反射運算元組

package Test2016.demo;import java.lang.reflect.Array;public class Demo4 {    public static void main(String[] args) throws Exception {                int[] arr = {1, 2, 3, 4, 5};                //getComponentType()返回你數組裡面裝的資料的資料類型的類名稱。這裡也就是int        Class<?> c = arr.getClass().getComponentType();                    System.out.println("數群組類型:" + c.getName());    //數群組類型:int                int len = Array.getLength(arr);        System.out.println("數組長度:" + len);    //數組長度:5                System.out.print("遍曆數組:");                for (int i = 0; i < len; i++) {            System.out.print(Array.get(arr, i) + " ");    //遍曆數組:1 2 3 4 5         }                System.out.println();                System.out.println("修改第三個資料前:" + Array.get(arr, 2));    //修改第三個資料前:3        Array.set(arr, 2, 10);        System.out.println("修改第三個資料前:" + Array.get(arr, 2));    //修改第三個資料前:10    }}

 注意點: 

  getFields()與getDeclaredFields()區別:

    getFields()只能訪問類中聲明為公有的欄位,私人的欄位它無法訪問,能訪問從其它類繼承來的公有方法.

    getDeclaredFields()能訪問類中所有的欄位,與public,private,protect無關,不能訪問從其它類繼承來的方法  

   getMethods()與getDeclaredMethods()區別:

    getMethods()只能訪問類中聲明為公有的方法,私人的方法它無法訪問,能訪問從其它類繼承來的公有方法.

    getDeclaredFields()能訪問類中所有的欄位,與public,private,protect無關,不能訪問從其它類繼承來的方法  

   getConstructors()與getDeclaredConstructors()區別:

    getConstructors()只能訪問類中聲明為public的建構函式.

    getDeclaredConstructors()能訪問類中所有的建構函式,與public,private,protect無關 

    

JAVA反射其實就是那麼一回事

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.