1. 什麼是反射?反射的應用場景?
JAVA 反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲 java 語言的反射機制。
獲取類對象的三種方式:
-
通過 object 類的 getClass () 函數,由於 object 是根類,每一個類都有這個函數
-
每一個類(包括基本數據類型,注意這裏基本數據類型不用轉成包裝類)都有一個 class 屬性,靜態屬性,通過類名直接訪問
-
通過 Class 類的靜態方法 forName(String className)
應用:
- 反射是很多框架的基礎
- 通過反射運行配置文件
- 通過反射越過泛型檢查
2. 代理模式有什麼用?應用場景是什麼?
代理(Proxy)模式是結構型的設計模式之一,它可以爲其他對象提供一種代理(Proxy)以控制對這個對象的訪問。所謂代理,是指具有與被代理的對象具有相同的接口的類,客戶端必須通過代理與被代理的目標類交互。
應用場景:
- 需要控制對目標對象的訪問。
- 需要對目標對象進行方法增強。如:添加日誌記錄,計算耗時等。
- 需要延遲加載目標對象。
3. 動態代理的實現方式都有什麼?那種實現效率高?
實現動態代理的兩種方式: JDK 動態代理和 Gglib 動態代理
-
JDK 動態代理是實現了被代理對象的接口, Cglib 是繼承了被代理對象。
-
JDK 和 Cglib 都是在運行期生成字節碼,JDK 是直接寫 Class 字節碼,Cglib 使用 ASM 框架寫 Class 字節碼,Cglib 代理實現更復雜,生成代理類比 JDK 效率低。
-
JDK 調用代理方法,是通過反射機制調用,Cglib 是通過 FastClass 機制直接調用方法,Cglib 執行效率更高。
4. 動態代理是什麼?與靜態代理的區別在於?
Java 中的靜態代理要求代理主題 (ProxySubject) 和真實主題 (RealSubject) 都實現同一個接口 (Subject)。靜態代理中代理類在編譯期就已經確定,而動態代理則是 JVM 運行時動態生成,靜態代理的效率相對動態代理來說相對高一些,但是靜態代理代碼冗餘大,一但需要修改接口,代理類和委託類都需要修改。
【Java 面試那點事】
這裏致力於分享 Java 面試路上的各種知識,無論是技術還是經驗,你需要的這裏都有!
這裏可以讓你【快速瞭解 Java 相關知識】,並且【短時間在面試方面有跨越式提升】
面試路上,你不孤單!