目錄
1. 代理相關 從靜態代理到動態代理
2. cglib可以代理被final修飾的類嗎,為什么
3. JVM 體系結構
4. 垃圾回收算法
5. 什么是注解 如何使用 底層原理
6. synchronized和reentrantlock
7. 講一下你項目中 redis的分布式鎖 與java自帶的鎖有啥區別
8. post 請求和 get 請求的區別
9. IOC 和 AOP 的使用
10. 過濾器和攔截器
11. 如果現在要寫一個攔截器去攔截訪問路徑 你會怎么設計
12. redis 數據結構
13. redis 哨兵以及他的優點
14. 算法 力扣 7 整數翻轉 中等題
總結
1. 代理相關 從靜態代理到動態代理
對目標行為的一種增強 前增強 后增強
靜態代理
接口 定義規則
實現了接口的具體類
代理類 代理類生成具體類對象
然后繼承了代理類
重寫方法
使用具體類對象調用方法 并且加上自己邏輯
我們只要使用代理類對象就能實現代理
動態代理分為 JDK 動態代理和 Cglib 動態代理
JDK 動態代理主要是利用了 Proxy 類里面的 newProxyInstance(不會讀 說的新的代理單例) 方法獲取代理單例
傳入參數 類加載器 實現接口 代理對象自定義類
代理對象自定義類實現了一個叫調用處理的接口(InvocationHandler)
然后重寫 invoke 方法
原理實際上是將方法傳到了 InvocationHandler 的 invoke 方法里面去
之后重寫邏輯即可
cglib 動態代理也是如同 jdk 動態代理一樣 (這邊沒說) 首先用工廠模式創建一個 Factory
定義一個方法獲取代理對象 傳入 Object
然后創建增強對象
傳入類加載器
代理類
攔截器
攔截器同樣是實現接口 我們在里面重寫方法(這邊說累了 就沒說 )
最后總結
JDK 動態代理使用較多 但是限制是只能代理接口類
最后又想了想 靜態代理是編譯的時候就進入機器的 可拓展性很差
動態代理允許在運行的時候動態編譯... (忘了)
(答 太多 就虛了 瘋狂遺忘+口誤)
2. cglib可以代理被final修飾的類嗎,為什么
cglib動態代理是原理靠繼承實現的
相當于讓父類繼承子類 然后優先調用子類的方法
面試官說我答的很含糊 問我有沒有看過源碼
我講了一下cglib 動態代理的流程
工廠模式創建一個 factory 對象 然后創建一個動態代理增強類 Enhancer 對象
通過增強類的 set 方法傳入參數
第一個參數 利用反射得到的類加載器
第二個參數 被代理類
第三個參數 方法攔截器 使用的一個命名為回調方法的東西
最后返回這個 代理類對象的 create() 方法
其中這個方法攔截器 實現了 MethodInterceptor 接口
重寫了 intercept 方法
添加了自己的操作 與 jdk 動態代理的 invoke 方法相似
面試官又問我如何體現繼承的
我說我看過源碼 方法攔截器是傳到一個數組里面去了 我看不懂源碼 (汗流浹背)
3. JVM 體系結構
只記得類加載器
講了一會 巴拉巴拉 八股吟唱 啦啦啦
加載 連接 初始化 使用 卸載
連接又分為驗證 準備 解析
還卡了好幾下
讓我別講了