Java基礎 —— 反射

走进舒适圈發表於2024-12-08

動態語言

 動態語言,是指程式在執行時可以改變其結構(新函式可以引進,已有的函式可以被刪除等結構上的變化)。如:JavaScript、Python就屬於動態語言,而C、C++則不屬於動態語言,從反射的角度說,Java屬於半動態語言。

反射

 反射就是在執行狀態時,對任意一個類,都能知道類中的屬性和方法,對任意一個物件,都能呼叫它的任意屬性和方法(動態獲取資訊、動態獲取物件)。

框架 = 反射 + 註解 + 設計模式

Class物件

 程式執行時,編寫的每一個類都會被編譯成.class檔案,當我們new物件或者類載入器載入時,JVM會將.class檔案載入到記憶體中,即當一個類載入器完成之後,在堆記憶體的方法區中生成了一個該類唯一的class物件。

獲取Class物件的四種方式

  • 透過Object類中的getClass()方法獲取
  • 透過類名.class直接獲取
  • 透過Class類中的forName()方法獲取(推薦)
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> name = Class.forName("reflect.Person");
        //獲取類中所以方法資訊
        Class<?>[] declaredClasses = name.getDeclaredClasses();
        for (Class<?> declaredClass : declaredClasses) {
            System.out.println(declaredClass.toString());
        }
        //獲取類中所有屬性資訊
        Field[] fields = name.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.toString());
        }
        //獲取類中所有構造方法資訊
        Constructor<?>[] declaredConstructors = name.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor.toString());
        }
    }
}
  • 透過類載入器ClassLoader獲取

建立物件的兩種方式

  • Class物件的newInstance()方法

這種方法要求該Class物件對應的類有空參構造

  • Constructor物件的newInstance()方法

先呼叫Class物件獲取指定的Constructor物件,再呼叫Constructor物件的newInstance()方法建立Class物件對應類的例項

應用場景

  • 載入資料庫驅動

在我們做專案時,底層資料庫有時用MySQL,有時用Oracle,這時候我們就需要動態的去載入資料庫驅動類;如:使用JDBC連線資料庫時,利用Class.forName()方法透過反射載入資料庫。

public class JDBCUtils {
    public static final String url = "jdbc:mysql://localhost:3306/crm";
    public static final String username = "root";
    public static final String password = "root";
    //3.載入驅動  反射技術
    //靜態程式碼塊 優先於任何程式執行,並且只執行一次
    static{
        try {//異常體系
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //4.由驅動管理器獲取連線
    //靜態方法  無須建立物件直接使用類名來呼叫
    //靜態方法不能呼叫普通屬性
    public static Connection getConnection() throws SQLException {
        Connection connection = DriverManager.getConnection(url, username, password);
        return connection;
    }
}
  • 載入配置檔案

像Spring框架中的IOC容器

相關文章