[JAVA] 什麼是反射 ? JAVA運行與反射觀念
在使用各式各樣的框架 ex:Spring , Hibernate時
一直有種不踏實感。所以決定深入去了解框架內查詢運用的原理之一反射
在反射之前 So> How does java work?
Java在運行三個階段
.JAVA -> .Class ->011010
源碼 ->Java bytecode ->機械碼
.Java(原始碼)
也就是我們所編寫的code也就是在IDE上編寫程式新增class
javac xxx.java
經過javac compiler 將所編寫的java檔編譯為.class檔
.Class(Java bytecode)
JVM並不是專為Java所實現的執行時
實際上只要有其他程式語言的編譯器能生成正確Java bytecode檔案,則這個
語言也能實現在JVM上執行
也就是
透過JAVAC 編譯成 (ByteCode).class JVM讀取 ->01110101機械碼
JVM 不是只有JAVA 語言謝的才可以運行
在編譯時期編譯器會先檢查對應的 .class 檔案,而執行時期JVM在使用某類別時,會先檢查對應的 Class 物件是否已經載入,如果沒有載入,則會尋找對應的 .class 檔案並載入
一個類別在 JVM 中只會有一個 Class 實例,每個類別的實例都會記得自己是由哪個 Class 實例所生成
什麼是反射?
反射是一種JAVA 提供的機制,允許執行時期動態載入類別、檢視類別資訊、生成物件或操作生成的物件。
一句話解釋
反射(Reflection)是JAVA 在運行時,可以動態操作類別的方法
反射原理與如何操作
反射是JVM運行會產生.class檔會產生class物件
使用 java.lang.class/java.lang.reflect的方法反向
產生object 的資訊
因此一個class物件也表示一個類別的特定屬性
只透過java.lang.Class類無法取得類別所有訊息,所以要在加載
java.lang.Class 類無法描述所有類別的訊息因此要載入
java的java.lang.reflect 包內的類別 提供更多方法
import java.lang.reflect.*;
將java類中的各種屬性映射成對應的java類
怎麼用反射
創建class 類別的物件有三種方法
- forName() method of Class class
- getClass() method of Object class
- the .class syntax
//透過類別名稱產生class物件Class c = Class.forName(className);Object obj = c.newInstance();
呼叫java的java.lang.reflect 類別方法
// 取得類別名稱(含package名稱)
System.out.println("class name : " + c.getCanonicalName());// 類別名稱
System.out.println("class name : " + c.getSimpleName());// 類別方法名稱
Method[] methods = c.getDeclaredMethods();
for(int i = 0 ; i < methods.length ; i++) { System.out.println(
"method" + i + " : " + methods[i].getName());
}// 屬性/成員變數名稱
Field[] fields = c.getDeclaredFields();
for(int i = 0 ; i < fields.length ; i++) {
System.out.println("field" + i + " : " + fields[i].getName());
}
參考資料