1.2 反射
1.2.1 學習筆記
參考資料:Java 2 核心技術卷I:基礎知識(第7版) 5.5 反射
(1) Class類
在程序運行期間,Java運行時系統始終為所有對象的維護一個被稱為運行時的類型標識。這個信息保存著每一個對象所有屬性的類足跡。虛擬機利用運行信息選擇相應的方法執行。
獲取Class類對象的三種方法
(a) getClass()
Employee e;
…
Class cl=e.getClass();
System.out.println(cl.getName()+“ ” +e.getName());
Result:
Employee Harry
(b) forName()
String className= “java.util.Date ”;
Class cl=Class.forName(className);
(c) .class
Class cl1=Date.class;
Class cl2=int.class;
(2) 反射的分析能力
示例:
Employee.java:
publicclass Employee {
private String name;
privateintage;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getSalary() {
returnage;
}
publicvoid setSalary(int salary) {
this.age = salary;
}
public Employee(String name, int salary) {
this.name = name;
this.age = salary;
}
}
Test.java
import java.lang.reflect.Field;
publicclass test {
publicstaticvoid main(String[] args) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {
Employee zhanjh = new Employee("zhan jh", 1000);
Class<?> cl = zhanjh.getClass();
Field f = cl.getDeclaredField("name"); // 返回名稱為“name”的私有或公有成員(域)
f.setAccessible(true); // 非常重要,否則無法調用f.get(zhanjh)方法
Object v = f.get(zhanjh);// 返回zhanjh對象中 name成員(域)的值
System.out.println(v.toString());
}
}
/*
* 運行結果: zhan jh
*/