程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java:反射,java反射

Java:反射,java反射

編輯:JAVA綜合教程

Java:反射,java反射


初識Java反射機制:

  從上面的描述可以看出Java的反射機制使得Java語言可以在運行時去認識在編譯時並不了解的類/對象的信息,並且能夠調用相應的方法或修改屬性的值。Java反射機制的核心就是允許在運行時通過Java Reflection APIs來取得已知名字的class類的內部信息(包括其modifiers(如public, static等)、superclass(如Object)、interfaces(如Serializable),也包括fields和methods的所有信息),動態地生成此類,並調用其方法或修改其域(甚至是本身聲明為private的域或方法)。這種反射機制為Java本身帶來了動態性,是一個非常強大的工具,能夠讓代碼變得更加靈活。

 

簡單示例:

 

細說Java反射機制:

此處參考了這篇文章:Java反射機制  http://blog.csdn.net/jackiehff/article/details/8509075

 

(1)Class對象

  Class對象是Java反射的基礎,它包含了與類相關的信息,實際上,Class對象是用來創建類的所有對象的。Class對象是java.lang.Class<T>這個類生成的對象,其中參數T表示用此Class對象建模的類的類型。例如,String.class的類型是 Class<String>;如果被建模的類的類型未知,則使用Class<?>,下圖有所體現:

以下是Java API的描述:

  Class類的實例表示正在運行的 Java應用程序中的類和接口。基本的Java類型(booleanbytecharshortintlongfloatdouble)和關鍵字void也表示為Class對象。所有具有相同元素類型和維數的數組都共享同一個Class對象。

  實際上,每個類都有一個Class對象。換言之,每當編寫並且編譯了一個新類,就會產生一個Class對象(更恰當的說,是被保存在一個同名的.class文件中)。如果我們想生成某個類的對象,運行這個程序的虛擬機(JVM)將使用類加載器檢查這個類的Class對象是否已經加載。如果尚未加載,默認的類加載器就會根據類名查找.class文件,並將其載入,一旦某個類的Class對象被載入內存,它就被用來創建這個類的所有對象。

  Class沒有公共構造方法,Class對象是在加載類時由Java虛擬機以及通過調用類加載器中的defineClass方法自動構造的。

 

獲取Class對象有三種方式:

A、通過實例變量的getClass()方法。

  示例:Class c = new String("abc").getClass();

B、通過Class類的靜態方法——forName()來實現。

  示例:Class c =Class.forName("className");

  注:當使用Class.forName()方法時,你必須提供完整類名(類名要包括包名)。例如,如果MyObject是位於包com.test下,那麼類的完整類名是com.test.MyObject。如果運行時在類路徑上找不到指定的類,Class.forName()方法會拋出一個ClassNotFoundException。

C、使用類字面常量或TYPE字段。

  示例:Class c = MyObject.class;

  注:類字面常量不僅可以應用於普通的類,也可以應用於接口、數組以及基本數據類型,這種方式不僅更簡單,而且更安全,因為它在編譯時就會受到檢查,並且根除了對forName方法的調用,所以也更高效,建議使用“.class”的形式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved