程式員的思維是非常活躍的,剛看pom.xml檔案時,突然忘了maven是什麼意思,查了下,Maven這個單詞來自於意第緒語,意為知識的積累……
知識是不停的在積累的,有些時候,必須要自己過一遍才能清楚是不是積累到自己的知識庫裡面。這裡,理理java的基礎,反射機制。
先看原理:
定義,JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態擷取的資訊以及動態調用對象的方法的功能稱為java語言的反射機制。
和大多定義一樣,就是讓人必須一字字斟酌才懂,簡單的說,java反射機制的意思就是 通過名稱得到對象(類、屬性、方法)的技術。
提供如下功能:
在運行時判斷任意一個對象所屬的類。
在運行時構造任意一個類的對象。
在運行時判斷任意一個類所具有的成員變數和方法。
在運行時調用任意一個對象的方法
這時候,可能有的人會頓悟了,原來自己一直在使用這項技術。
依照慣例,貼源碼,這麼看著清晰些:
package nov;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * * * <p> * Title: 反射機制測試代碼 /p> * * <p> * Description: 樣本 業務類 * </p> * * <p> * Copyright: Copyright (c) 2012 * </p> * * * @author dml@2012-11-29 * @version 1.0 */public class ReflectTester {public Object copy(Object object) throws Exception {// 獲得對象的類型Class<?> classType = object.getClass();System.out.println("Class:" + classType.getName());// 通過預設構造方法建立一個新的對象Object objectCopy = classType.getConstructor(new Class[] {}).newInstance(new Object[] {});// 獲得對象的所有屬性Field fields[] = classType.getDeclaredFields();for (int i = 0; i < fields.length; i++) {Field field = fields[i];// 屬性名稱String fieldName = field.getName();// 得到屬性名稱的第一個字母並轉成大寫String firstLetter = fieldName.substring(0, 1).toUpperCase();// 獲得和屬性對應的getXXX()方法的名字:get+屬性名稱的第一個字母並轉成大寫+屬性名稱去掉第一個字母,// 如屬性名稱為name,則:get+N+ameString getMethodName = "get" + firstLetter + fieldName.substring(1);// 獲得和屬性對應的setXXX()方法的名字String setMethodName = "set" + firstLetter + fieldName.substring(1);// 獲得和屬性對應的getXXX()方法Method getMethod = classType.getMethod(getMethodName,new Class[] {});// 獲得和屬性對應的setXXX()方法,傳入參數為參數的類型Method setMethod = classType.getMethod(setMethodName,new Class[] { field.getType() });// 調用原對象的getXXX()方法Object value = getMethod.invoke(object, new Object[] {});System.out.println(fieldName + ":" + value);// 調用拷貝對象的setXXX()方法setMethod.invoke(objectCopy, new Object[] { value });}return objectCopy;}public static void main(String[] args) throws Exception {Customer customer = new Customer("Tom", 21);customer.setId(new Long(1));//運行時產生對象執行個體:類存在不帶參數的建構函式 直接使用newInstance()方法Customer customerCopy = (Customer) new ReflectTester().copy(customer);System.out.println("Copy information:" + customerCopy.getId() + " "+ customerCopy.getName() + " " + customerCopy.getAge());}}class Customer {private Long id;private String name;private int age;public Customer() {}public Customer(String name, int age) {this.name = name;this.age = age;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}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;}}
註:以上代碼摘自:【視頻筆記】Java反射機制筆記
輸入結果:
Class:nov.Customerid:1name:Tomage:21Copy information:1 Tom 21
細細看看這段代碼,然後再看理論,最後自己再理理,最後自己再寫一段程式,以後做項目的時候,就又多了一個好的工具了。
p.s.要下班了,最近這幾天很是鬱悶,嚮往的生活瞬間化為泡影,哎,一念天堂,一念地獄,誰又知道以後真會是個什麼樣?
dml@2012.11.29