1.呼叫反射的流程
(1)準備階段:編譯期裝載所有的類,將每個類別的元資訊保存至Class類別物件中,每一個類別對應一個Class物件
(2)取得Class物件:呼叫x.class/x.getClass()/Class.forName() 取得x的Class物件clz(這些方法的底層都是native方法,是在JVM底層編寫好的,涉及到了JVM底層,就先不進行探究了)
(3)進行實際反射操作:透過clz物件取得Field/Method/Constructor物件進行進一步操作
2.取得class類別
要想透過反射取得一個類別的信息,首先要取得此類別對應的Class類別實例,Class類別的實例代表了正在運行中的Java應用的類別和介面。 Class類別沒有公共的建構方法,Class類別物件是在二進位位元組流(一般是.class文件,也可透過網路或zip套件等路徑取得)被JVM載入時,透過呼叫類別載入器的defineClass ()方法來建構的。
/** * Instances of the class {@code Class} represent classes and * interfaces in a running Java application. * {@code Class} has no public constructor. Instead {@code Class} * objects are constructed automatically by the Java Virtual Machine as classes * are loaded and by calls to the {@code defineClass} method in the class * loader. */ public final class Class<T> implements java.io.Serializable,GenericDeclaration,Type,AnnotatedElement { ...... }
以上是Java反射的原理及其作用是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!