Java 反射機制的應用例項
阿新 • • 發佈:2018-12-18
Java 反射機制的應用例項
1. Java Reflection
- Reflection(反射)是被視為動態語言的關鍵,反射機制允許程式在執行期間藉助於Reflection API取得任何類的內部資訊,並能直接操作任意物件的內部屬性和方法
2. Java 反射機制提供的功能
- 在執行時判斷任意一個物件所屬的類
- 在執行時構造任意一個類的物件
- 在執行時判斷任意一個類所具有成員變數和方法
- 在執行時呼叫任意一個物件的成員變數和方法
- 生成動態代理
3. Java反射機制研究及應用
- java.lang.Class:代表一個類
- java.lang.reflect.Method:代表類的方法
- java.lang.reflect.Field:代表類的成員變數
- java.lang.reflect.Constructor:代表類的構造方法
- 等。。。
4. dome
public class TestReflection { //有了反射,可以通過反射建立一個類物件,並呼叫其中的結構 @Test public void test2() throws Exception { Class<Person> clazz = Person.class; //1.建立clazz對應的執行時類Person類的物件 Person p = clazz.newInstance(); System.out.println(p);// null 0 //2.通過反射呼叫執行時類的指定屬性 //2.1 Field f1 = clazz.getField("name"); f1.set(p, "LiuDeHua"); System.out.println(p);//Person [name=LiuDeHua, age=0] // Field f2 = clazz.getField("age");//java.lang.NoSuchFieldException: age,如果age的許可權修飾符不為public // f2.set(p, 30); // System.out.println(p); //2.2 Field f2 = clazz.getDeclaredField("age"); f2.setAccessible(true);//修改set的許可權,如沒有修改,會報沒有許可權的錯誤 f2.set(p, 30); System.out.println(p);//Person [name=LiuDeHua, age=30] //通過反射呼叫執行時類的指定方法 Method m1 = clazz.getMethod("show");//方法名和引數確定一個方法 m1.invoke(p); Method m2 = clazz.getMethod("display", String.class); m2.invoke(p, "HK"); } //在有反射以前,如果建立一個類的物件,並呼叫其中的方法、屬性 @Test public void test1() { Person p = new Person(); p.setAge(20); p.setName("Tom"); System.out.println(p); p.show(); p.display("US"); } } public class Person { //2.開啟一許可權 public String name ; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show () { System.out.println("我是一個人"); } public void display(String nation) { System.out.println("我的國籍是:" + nation); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
- 輸出