標籤:
什麼是反射
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反射其實就是那麼一回事