爲了便於理解,在給出代碼例子以前,首先用文字給你們說說關於」Java反射機制」的理論介紹。java
Java反射是Java語言的一個很重要的特徵,它使得Java具備了「動態性」。數組
在Java運行時環境中,對於一個類,可否知道這個類有哪些屬性和方法?對於任意一個對象,可否調用它的任意一個方法?答案是確定的。這種動態獲取類的信息以及動態調用對象的方法的功能來自於Java語言的反射(Reflection)機制。spa
Java反射機制主要提供瞭如下功能:.net
Reflection是Java被視爲動態(或準動態)語言的一個關鍵性質。這個機制容許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括modifiers(諸如public,static等等)、superclass(例如Object)、實現之interfaces(例如Serializable),也包括fields和methods的全部信息,並可於運行時改變fields內容或調用methods。code
通常而言,開發者社羣說到動態語言,大體認同的一個定義是:「程序運行時,容許改變程序結構或變量類型,這種語言成爲動態語言」。從這個觀點看,Java就不是動態語言。對象
儘管在這樣的定義與分類下Java不是動態語言,它卻有着一個很是突出的動態相關機制:Reflection。這個字的意思是「反射、映像、倒影」,用在Java身上指的是咱們能夠於運行時加載、探知、使用編譯器件徹底未知的classes。換句話說,Java程序能夠加在一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods。這種「看透class」的能力(the ability of the program to examine itselt)被稱爲introspection(內省、內觀、檢討)。Reflection和introspection是常被並提的兩個術語。blog
在JDK中,主要由如下類來實現Java反射機制,這些類都位於java.lang.reflet包中:接口
Java中每一個類被加載以後,系統就會爲該類生成一個對應的Class對象,經過該Class對象就能夠訪問到JVM中的這個類。在Java程序中得到Class對象一般有以下三種方式。開發
1.使用Class類的forName(String clazzName)靜態方法。該方法須要傳入字符串參數,該字符串參數的值是某個類的全限定類名(必須包括完整包名)。字符串
代碼示例:Class clazz=Class.forName(「demo.Person」);」Demo」表明包名,」Person」表明類名。
2.調用某個類的class屬性來獲取該類對應的Class對象,例如,Person.class將會返回Person類對應的Class對象。
代碼示例:Class clazz=Person.class;
3.調用某個對象的getClass()方法,該方法是java.lang.Object類中的一個方法,因此全部的Java對象均可以調用該方法,該方法將會返回該對象所屬類對應的Class對象。
代碼示例:Person person=new Person();
Class clazz=person.getClass();
Class對象能夠得到該類裏的方法(由Method對象表示)、構造器(由Constructor對象表示)、成員變量(由Field)對象表示,這三個類都位於java.lang.reflect包下並實現了java.lang.reflect.Member接口。程序能夠經過Method對象來執行對應的方法,經過Constructor對象來調用對應的構造器建立實例,能經過Field對象直接訪問並修改對象的成員變量值。
經過反射來生成實例對象有以下兩種方式。
1.使用Class對象的newInstance()方法來建立該Class對應類的實例,這種方式要求該Class對象的對應類有默認構造器,而執行newInstance()時其實是利用默認構造器來建立該類的實例。
代碼示例:Class clazz=Person.class;
Object obj=clazz.newInstance();
2.先使用Class對象獲取指定的Constructor對象,再調用Constructor對象的newInstance()方法來建立該Class對象對應類的實例。經過這種方式能夠選擇使用指定的構造器來建立實例。
代碼示例:Class clazz=Person.class;
Constructor constructor=clazz.getConstructor(String.class);
Object obj=constructor.newInstance();
理論說了這麼多,接下來給個很全的案例你們看,畢竟」Talk is cheap,show me your code」。相信看了這個案例大家就會掌握對Java的反射機制了,我這裏參考的是CSDN上的一篇文章,就不重複造輪子了直接給連接大家去看他寫的代碼。一個例子讓你瞭解Java反射機制。