1. 程式人生 > 實用技巧 >【Java反射機制 01】

【Java反射機制 01】

一、含義:

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...