1. 程式人生 > 實用技巧 >JAVA實現LRU演算法

JAVA實現LRU演算法

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 等框架也大量使用到了反射機制。

  1. 我們在使用 JDBC 連線資料庫時使用Class.forName()通過反射載入資料庫的驅動程式;
  2. Spring 框架的 IOC(動態載入管理 Bean)建立物件以及 AOP(動態代理)功能都和反射有聯絡;
  3. 動態配置例項的屬性;

參考

javaGuide

https://blog.csdn.net/Mr_wxc/article/details/105812627

https://zhuanlan.zhihu.com/p/80519709