動態語言
動態語言,是指程式在執行時可以改變其結構(新函式可以引進,已有的函式可以被刪除等結構上的變化)。如: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容器