一句話歸納就是使用反射能夠賦予jvm動態編譯的能力,不然類的元數據信息只能用靜態編譯的方式實現,例如熱加載,Tomcat的classloader等等都無法支持html
Java中編譯類型有兩種:java
- 靜態編譯:在編譯時肯定類型,綁定對象即經過。
- 動態編譯:運行時肯定類型,綁定對象。動態編譯最大限度地發揮了Java的靈活性,體現了多態的應用,能夠減低類之間的耦合性。
Java反射是Java被視爲動態(或準動態)語言的一個關鍵性質。這個機制容許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public、static等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields和methods的全部信息,並可於運行時改變fields內容或喚起methods。數組
Reflection能夠在運行時加載、探知、使用編譯期間徹底未知的classes。即Java程序能夠加載一個運行時才得知名稱的class,獲取其完整構造,並生成其對象實體、或對其fields設值、或喚起其methods。jvm
反射(reflection)容許靜態語言在運行時(runtime)檢查、修改程序的結構與行爲。
在靜態語言中,使用一個變量時,必須知道它的類型。在Java中,變量的類型信息在編譯時都保存到了class文件中,這樣在運行時才能保證準確無誤;換句話說,程序在運行時的行爲都是固定的。若是想在運行時改變,就須要反射這東西了。ide
實現Java反射機制的類都位於java.lang.reflect包中:ui
一、Class類:表明一個類.net
二、Field類:表明類的成員變量(類的屬性)htm
三、Method類:表明類的方法對象
四、Constructor類:表明類的構造方法blog
五、Array類:提供了動態建立數組,以及訪問數組的元素的靜態方法
* 對於修改靜態常量類型是須要當心
對於基本類型的靜態常量,JAVA在編譯的時候就會把代碼中對此常量中引用的地方替換成相應常量值
* 參考閱讀http://www.imooc.com/learn/199https://blog.csdn.net/u010832551/article/details/74202467http://wiki.jikexueyuan.com/project/java-reflection/jave-guide.html