【Java反射機制 01】
阿新 • • 發佈:2020-09-09
一、含義:
Java反射機制是在執行狀態中,對於任意一個類(class檔案),都能夠知道這個類的所有屬性和方法;
對於任意一個物件,都能夠呼叫它的任意一個方法和屬性
這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為Java語言的反射機制
動態獲取類中資訊,就是Java反射
可以理解為對類的解剖
反射必須要有介面和配置檔案兩大元素。
二、 位元組碼檔案物件
想要對一個類檔案進行解剖,只要獲取到該類位元組碼檔案物件即可
|-- 用於描述位元組碼的類叫class Class{
提供獲取位元組碼檔案中的內容。比如名稱,欄位,建構函式,一般函式
}
該類就可以獲取位元組碼檔案中的所有內容,那麼反射,就是依靠該類完成的。
三、獲取Class物件的三種方式
package com.FansheReflect; import com.JavaFanShe.Person; /** * @Author wufq * @Date 2020/9/8 16:38 */ public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { // getClassobject_1(); // getClassobject_2(); getClassobject_3(); }/* 方式三:通過給定類的字串名稱就可以獲取類,更為擴充套件 可是用Class類中的方法完成。 該方法就是forName 這種方法只需要名稱即可,更方便,擴充套件性更強 * */ public static void getClassobject_3() throws ClassNotFoundException { String className = "com.JavaFanShe.Person";// Class classs = Class.forName(className); //以下片段返回命名為java.lang.Thread的類的執行時Class描述符,所以定義的類字串是完整的帶包名的類名稱System.out.println(classs); } /* * 方式一:獲取位元組碼物件的方式: * 1.object類中的getClass方法 * 想要這種方式,必須要明確具體的類,並建立物件 * 麻煩!!! * */ public static void getClassobject_1(){ Person p = new Person(); Class aClass=p.getClass(); //呼叫person的預設構造器 -->Person run... Person p1 = new Person(); Class p1Class= p1.getClass();//呼叫person的預設構造器 -->Person run... System.out.println(aClass==p1Class); } /*方式二: * 任何資料型別都具備一個靜態的屬性.class來獲取其對應的class物件 * 相對簡單,但是還是要明確用到類中的靜態成員 * */ private static void getClassobject_2() { Class classz = Person.class; Class classz1 = Person.class; System.out.println(classz==classz1); } }
四、獲取Class中的建構函式
|-- 尋找類名稱檔案,並載入進記憶體,生成class物件
|-- 通過getConstructor(Class<?>... parameterTypes)方法獲取指定的構造方法,返回Constructor物件
|-- 通過newInstance()方法實現物件的生成
備註:如果呼叫預設構造器的話,就不需要獲取指定的構造方法,,直接實現方法的生成
package com.FansheReflect; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * @Author wufq * @Date 2020/9/9 15:46 */ public class ReflectDemo01 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { //creatNewObject_2(); //creatNewObject(); creatNewObject_1(); } public static void creatNewObject(){ //早期初始化物件-->預設構造器、構造方法呼叫 com.JavaFanShe.Person p = new com.JavaFanShe.Person(); com.JavaFanShe.Person p1 = new com.JavaFanShe.Person("小強",23); } //現在:通過該名稱類檔案地址 -->預設構造器、構造方法呼叫 public static void creatNewObject_1() throws ClassNotFoundException, IllegalAccessException, InstantiationException { String Naame ="com.JavaFanShe.Person"; //尋找該名稱類檔案,並載入進記憶體,併產生class物件 Class classs = Class.forName(Naame); //如何產生物件呢? Object obj =classs.newInstance(); } public static void creatNewObject_2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { String Naame ="com.JavaFanShe.Person"; //尋找該名稱類檔案,並載入進記憶體,併產生class物件 Class classs = Class.forName(Naame); //獲取到了指定物件的構造方法 Constructor con =classs.getConstructor(String.class,int.class); //真實產生物件 Object obj = con.newInstance("小強",22); } } =====執行結果===== Person param run...小強::22 Person run... Person param run...小強::23 Person run...