[JAVA] 什麼是反射 ? JAVA運行與反射觀念

KouWei.Lee
Nov 12, 2020

--

在使用各式各樣的框架 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());
}

--

--

No responses yet