⑴ 一文讀懂java中的反射,邊學邊實戰!
Java中的反射機制在運行時為我們提供了動態獲取類信息和對象方法的能力,是框架設計的核心要素。雖然在日常項目開發中用得不多,但它在模塊化開發、動態代理設計模式、Spring和Hibernate等框架中扮演著關鍵角色。
Class類是Java中描述數據類型(包括基本類型和引用類型)的關鍵。每個class在運行時對應一個JVM內部的Class實例,它包含了類的全名、包名、父類、介面、方法和欄位等詳細信息。獲取Class實例有四種常見方式:通過類的靜態變數、使用Class.forName()、實例的getClass()或通過ClassLoader.loadClass()。
反射的核心是通過Class實例獲取類的信息,如欄位和方法。例如,我們可以獲取到一個對象的欄位類型和值,甚至修改這些值,盡管這可能破壞封裝性。對於非public欄位和方法,通常需要先調用setAccessible(true)來解除訪問限制,但此操作可能因為安全策略而受限。
通過Method對象,我們可以調用類的方法,包括重載的方法。反射調用遵循多態原則,總是調用實際類型的覆蓋方法。創建實例時,Constructor對象允許我們調用任何形式的構造函數,包括私有或帶有參數的構造。
反射機制還幫助我們查詢繼承關系,包括父類類型和實現的介面。通過isAssignableFrom()方法,我們可以判斷一個類型是否可以被另一個類型安全地向上轉型。
總的來說,反射是Java中的強大工具,盡管在常規開發中並不常用,但在特定場景和框架設計中發揮著不可替代的作用。它提供了一種在運行時動態探索和操作類結構的能力。
⑵ java如何通過反射獲取包中所有的類
先通過IO,定位到這個包
通過File.list得到一個包含這個包下所有class的文件的數組。
循環這個數組,用包名拼接每一個遍歷出來的文件的名字,得到每一個完整的類名(即,包名加類名)
通過class.forname反射得到每一個類實例