1. 程式人生 > >Java基礎(三) 面試題整理

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類等。