JAVA實現LRU演算法
阿新 • • 發佈:2020-10-29
1,反射機制:
在程式執行狀態中,對於任意一個類,都能知道這個類的所有屬性和方法,對於任意一個物件,都能呼叫它任意一個方法和屬性,
這種動態呼叫物件的方法的功能稱為Java語言的反射機制。
2,反射的優缺點:
優:執行期型別的判斷,動態載入類,提高程式碼靈活度。
缺:①效能瓶頸,反射相當於一系列解釋操作,通知JVM做事,比java程式碼慢。
②安全問題,可以動態改變類的屬性,增加了安全隱患。
3,Class物件:在類載入裡提到,在類載入完成後,會對每一個類在記憶體中生成一個java.lang.Class物件,用於訪問類的資源。
3.1,java程式碼在計算機中的3個階段
- source原始碼階段,.java檔案編譯生成.class檔案。
- Class物件階段:.class位元組碼檔案,通過類載入器載入進記憶體,並封裝成Class物件,用於在記憶體中描述位元組碼檔案。
Class物件將原位元組碼檔案中成員變數、建構函式、成員方法分別封裝成陣列:Field[],Construction[],Method[].
- RunTime執行階段:使用new建立物件的過程
3.2,獲取Class物件的方式:
- source原始碼階段:Class.forName("類全限定名"),將位元組碼檔案載入進記憶體(如果為載入),返回Class物件。
- 使用類載入器:Class c=ClassLoader.LoadClass("類全限定名")
- Class物件階段(知道具體類):類名.class 不一定是類,任意資料型別都具備一個class靜態屬性。int.class, int[].class
- RunTime執行階段:已知一個物件例項,A.getClass(), Object類中方法。
4,Class類物件功能:
4.1,獲取成員變數:
- Field[] getFields() 獲取所有public成員變數
- Field getField(String name) 獲取指定名稱的public成員變數
- Field[] getDeclaredFields() 獲取所有成員變數,不考慮修飾符
- Field getDeclaredFields(String name) 獲取指定成員變數,不考慮修飾符
4.2,獲取構造方法:
- Construction[] getConstructors() 獲取所有public修飾的建構函式
- Construction getConstruction(Class... parameterTypes) 獲取有指定引數型別的public修飾的構造器。如getConstruction(String.class,int.class)
不傳參時返回無參建構函式,不存在丟擲異常
- Construction[]getDeclaredConstructors() 獲取所有的建構函式,不考慮修飾符
- Construction getDeclaredConstruction(Class... parameterTypes) 獲取有指定引數型別的構造器,不考慮修飾符。
4.3,獲取成員方法:
- Method[] getMethods() 獲取所有public修飾的成員方法
- Method getMethod(String name,Class... parameterTypes) //獲取指定名稱的public修飾的成員方法
- Method[] getDeclaredMethods() //獲取所有的成員方法,不考慮修飾符
- Method getDeclaredMethod(String name, Class... parameterTypes) //獲取指定名稱的成員方法,不考慮修飾符
4.3,獲取全類名:
- String getName()
4.4,初始化物件---使用構造方法
- newInstance()方法
4.5,呼叫方法
- invoke()方法
5,反射的應用場景:
反射是框架設計的靈魂。
在我們平時的專案開發過程中,基本上很少會直接使用到反射機制,但這不能說明反射機制沒有用,實際上有很多設計、
開發都與反射機制有關,例如模組化的開發,通過反射去呼叫對應的位元組碼;動態代理設計模式也採用了反射機制,
還有我們日常使用的 Spring/Hibernate 等框架也大量使用到了反射機制。
- 我們在使用 JDBC 連線資料庫時使用
Class.forName()
通過反射載入資料庫的驅動程式; - Spring 框架的 IOC(動態載入管理 Bean)建立物件以及 AOP(動態代理)功能都和反射有聯絡;
- 動態配置例項的屬性;
參考