Java基礎(三) 面試題整理
反射機制以及反射的方式
1. Java反射機制是什麼
在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。
2. 反射機制提供的功能
在執行時判斷任意一個物件所屬的類;
在執行時構造任意一個類的物件;
在執行時判斷任意一個類所具有的成員變數和方法;
在執行時呼叫任意一個物件的方法;
生成動態代理。
3. 反射的方式(三種)
1)通過Object類的getClass(),獲得該類的位元組碼檔案(.class檔案)
List<String> list = new ArrayList<>();
Class<?> clazz_3 = list.getClass();
2)通過”類.class”方式
需要輸入一個明確的類,任意一個型別都有一個靜態的class屬性
Class<?> clazz_2 = ArrayList.class;
3)通過Class.forName()方式
通過Class類的一個forName(String className)靜態方法返回一個Class物件,className必須是全路徑名稱
Class<?> clazz_1 = Class.forName("java.util.ArrayList");
類載入有幾種方式
共三種方式
1. 由new關鍵字建立一個類的例項
List<String> list_1 = new ArrayList<>();
2. 使用Class.forName()方法
通過反射載入型別
Class<?> clazz_2 = Class.forName("java.util.ArrayList");
List<String> list_2 = (List<String>) clazz_2.newInstance();
3. 呼叫某個ClassLoader例項的loadClass()方法
通過該ClassLoader例項的loadClass()方法載入。應用程式可以通過繼承ClassLoader實現自己的類載入器。
1)載入其他類,必須要有一個ClassLoader例項物件
ClassLoader classLoader = new ClassLoader() {};
Class<?> clazz_3 = classLoader.loadClass("java.util.ArrayList");
List<String> list_3 = (List<String>) clazz_3.newInstance();
2)載入當前類,直接使用當前類的類載入器
Class<?> clazz = Demo_1.class.getClassLoader().loadClass("reflect.Demo_1");
Demo_1 demo_1 = (Demo_1) clazz.newInstance();
Class.forName()和ClassLoader.loadClass()的區別
1. 類裝載過程
載入
通過類的全限定名獲取二進位制位元組流,將二進位制位元組流轉換成方法區中的執行時資料結構,在記憶體中生成Java.lang.class物件;
連結
執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;
校驗:檢查匯入類或介面的二進位制資料的正確性;(檔案格式驗證,元資料驗證,位元組碼驗證,符號引用驗證)
準備:給類的靜態變數分配並初始化儲存空間;
解析:將常量池中的符號引用轉成直接引用;
初始化
啟用類的靜態變數的初始化Java程式碼和靜態Java程式碼塊,並初始化程式設計師設定的變數值
2. 區別
Class.forName(),會執行static靜態程式碼塊以及初始化static引數;
ClassLoader.loadClass(),不會執行靜態塊和靜態物件。
3. 資料庫連結為什麼使用Class.forName(className)
Class.forName(classname)才能在反射回去類的時候執行static塊
JDBC Driver原始碼如下:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
如何防止建立的類名不能為Java為已有類,Java載入雙親委派機制
某個特定的類載入器在接到載入類的請求時,首先將載入任務委託給父類載入器,依次遞迴,如果父類載入器可以完成類載入任務,就成功返回;只有父類載入器無法完成此載入任務時,才自己去載入。
rt.jar類庫: JAVA基礎類庫,基礎資料型別等io.lang. 比如裡面有String類Long類等。