【java】源碼詳解Java的反射機制

來源:互聯網
上載者:User

程式員的思維是非常活躍的,剛看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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.