java反射系列一
阿新 • • 發佈:2019-01-28
ESS 內部 override ref todo 動態語言 port 傳參 col 一.概念認知
1.1 ●Java Reflection
Reflection (反射)是被視為動態語言的關鍵, 反射機制允許程序在執行期借助於Reflection API取得任何類的內部信息, 並能直接操作任意對象的內部屬性及方法
1.2 ●Java反射機制提供的功能
?在運行時判斷任意一 個對象所屬的類 ?在運行時構造任意-個類的對象
?在運行時判斷任意一個類所具有的成員變量和方法 ?在運行時調用任意個對象的成員變量和方法 ?生成動態代理 1.3 Java反射機制研究及應用
●反射相關的主要API: ?java.lang.Class:代表一 個類
?java.lang.reflect,Method:代表 類的方法 ?java.lang.reflect.Field:代表 類的成員變量
?java.lang.reflect.Constructor:代表 類的構造方法
二.代碼示例
Reflection (反射)是被視為動態語言的關鍵, 反射機制允許程序在執行期借助於Reflection API取得任何類的內部信息, 並能直接操作任意對象的內部屬性及方法
1.2 ●Java反射機制提供的功能
?在運行時判斷任意一 個對象所屬的類 ?在運行時構造任意-個類的對象
?在運行時判斷任意一個類所具有的成員變量和方法 ?在運行時調用任意個對象的成員變量和方法 ?生成動態代理 1.3 Java反射機制研究及應用
●反射相關的主要API: ?java.lang.Class:代表一 個類
?java.lang.reflect,Method:代表 類的方法 ?java.lang.reflect.Field:代表 類的成員變量
二.代碼示例
package reflect; public class Person { public String name; private int age; public Person() { super(); // TODO Auto-generated constructor stub } 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 + "]"; } }
package reflect; import java.lang.reflect.Field; import java.lang.reflect.Method; public class TestReflection { public static void main(String[] args) throws Exception { TestReflection t = new TestReflection(); t.test2(); } //反射思想.創建一個類的對象.並調用其中的結構 public void test2() throws Exception { //此代碼指向Person類,其所有屬性.方法均暴露 ①Class clazz = Person.class; /* * 1.創建clazz對應的運行時類Person類的對象 * public T newInstance() throws InstantiationException, IllegalAccessException創建由此類對象表示的類的新實例。 */ ②Person p = (Person)clazz.newInstance(); System.out.println(p); /* * getField(String name) * 返回一個 Field對象,它反映此表示的類或接口的指定公共成員字段 類對象。 */ ③Field f1 = clazz.getField("name"); /* * set(Object obj, Object value) * 將指定對象參數上的此 Field對象表示的字段設置為指定的新值。 */ ④f1.set(p, "巫妖果子"); System.out.println(p); /* * 2.私有屬性 * getDeclaredField(String name) 返回一個 Field對象, * 它反映此表示的類或接口的指定已聲明字段 類對象。 */ ⑤Field f2 = clazz.getDeclaredField("age"); ⑥f2.setAccessible(true); f2.set(p, 20); System.out.println(p); /* * 3.通過反射調用運行時類的指定的方法 *getMethods() 返回包含一個數組 方法對象反射由此表示的類或接口的所有公共方法 類對象, *包括那些由類或接口和那些從超類和超接口繼承的聲明 */ ⑦Method m1 = clazz.getMethod("display", String.class); /* * invoke(Object obj, Object... args) * 在具有指定參數的 方法對象上調用此 方法對象表示的底層方法。 */ ⑧m1.invoke(p, "中國"); ⑨Method m2 = clazz.getMethod("show"); m2.invoke(p); } //面向對象的思想.創建一個類的對象,並調用其中的方法.屬性 public void test1(){ Person p = new Person(); p.setAge(20); p.setName("巫妖果子"); System.out.println(p); p.show(); p.display("中國"); } }
程序分析:①②處相當於面向對象的
Person p = new Person();
這行代碼,創建實例
③處是指定Person中的屬性(公共權限)④處設置屬性值⑤處由於age屬性的權限是私有的,所以
getDeclaredField("age")
起聲明作用⑥僅僅是這樣還不足以設置私有屬性,故有此行代碼⑦處指定有參方法⑧處傳參
⑨處是無參方法
java反射系列一