Java筆記-反射機制(一)

Java反射機制(一)

結合Oracle官方經過JDK8編寫的反射教程,複習一下反射的知識。結尾篇補一個小例子。java

主要內容

此次博客的主要內容就是簡單介紹反射的概念以及相關獲取類信息的反射API。安全

反射的概念

反射是一種在運行時獲取以及修改應用行爲的一種工具。我我的的理解就是,new是一種正向的操做,知道現有系統中會出現什麼。反射就是反着來,不知道系統中可能會須要什麼樣的類,經過全限定類名的方式,在須要的時候將它反射出來,同時能夠經過反射獲取類的內部信息。在Java框架的開發中,反射技術運用比較常見。oracle

反射的優缺點

優勢

  1. 強大的擴展性,用戶能夠經過全限定類名的方式去使用外部定義的類。
  2. 幫助IDE開發工具獲取用戶正在開發的code的信息,提示寫出更正確的代碼。
  3. 利於調試工具獲取運行時信息以及測試類框架的使用好比Junit。

缺點

  1. 影響性能。 由於反射須要動態的解析類的信息,相比於非反射使用的方式要慢。
  2. 對安全環境有要求。 反射須要獲取必定的運行時權限,在特定的安全環境下不必定存在。
  3. 暴露了內部的封裝,可能會引發一些負面效果。好比不應被外部調用的私有方法,經過反射被調用了。

經過反射獲取類信息

Java中除了基本類型就是引用類型。
boolean,int,long,float等就是基本類型
java.lang.String,Java.io.Serializable就是引用類型app

獲取java.lang.Class

對於每一種類型,Java提供了java.lang.Class這個類用於獲取運行時類的屬性和方法信息。同時java.lang.Class也能夠用於建立類和對象。
若是是對象類型的話,能夠經過其最上層父類Object提供的getClass()方法獲取Class類。框架

"apple".getClass();

若是是基本類型或者對於一個普通的類來講,可使用.class的方式來獲取Class類,以下。ide

int.class;
java.io.PrintStream.class;

當獲取到類的全限定類名後,能夠經過Class.forName建立一個類,以下。工具

Class c = Class.forName("com.coderising.kailuncen.Main");

獲取類的相關類信息

如下Api能夠用於獲取類的相關類信息。
獲取類的父類信息:性能

Class.getSuperclass()

獲取類的成員類信息,不包括私有的:開發工具

Class.getClasses()

獲取類的全部成員類信息,包括私有的:測試

Class.getDeclaredClasses()

如下API能夠返回聲明瞭這些成員變量的類的Class信息。

Class.getDeclaringClass()
java.lang.reflect.Field.getDeclaringClass()
java.lang.reflect.Method.getDeclaringClass()
java.lang.reflect.Constructor.getDeclaringClass()

若是這個類是匿名類的話,能夠經過以下API獲取包含它的類的類信息。

Class.getEnclosingClass()

獲取類的修飾符

類在運行期間能夠被多種修飾符修飾,以下所示
訪問限定符: public, protected, and private。
須要override的修飾符:abstract。
而後static,final,Annotations等。
反射API可使用以下方法去訪問他們。

Class.getModifiers()
 Class.getAnnotations();

獲取類的成員信息

在oracle的教程中,整理了三個表格,介紹瞭如何獲取類的成員信息。

相關文章
相關標籤/搜索