Java中為什么需要反射?反射要解決什么問題?


一句話概括就是使用反射可以賦予jvm動態編譯的能力,否則類的元數據信息只能用靜態編譯的方式實現,例如熱加載,Tomcat的classloader等等都沒法支持

 

Java中編譯類型有兩種:

  • 靜態編譯:在編譯時確定類型,綁定對象即通過。
  • 動態編譯:運行時確定類型,綁定對象。動態編譯最大限度地發揮了Java的靈活性,體現了多態的應用,可以減低類之間的耦合性。

Java反射是Java被視為動態(或准動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public、static等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields和methods的所有信息,並可於運行時改變fields內容或喚起methods。

Reflection可以在運行時加載、探知、使用編譯期間完全未知的classes。即Java程序可以加載一個運行時才得知名稱的class,獲取其完整構造,並生成其對象實體、或對其fields設值、或喚起其methods。

反射(reflection)允許靜態語言在運行時(runtime)檢查、修改程序的結構與行為。
在靜態語言中,使用一個變量時,必須知道它的類型。在Java中,變量的類型信息在編譯時都保存到了class文件中,這樣在運行時才能保證准確無誤;換句話說,程序在運行時的行為都是固定的。如果想在運行時改變,就需要反射這東西了。

實現Java反射機制的類都位於java.lang.reflect包中:

1、Class類:代表一個類

2、Field類:代表類的成員變量(類的屬性)

3、Method類:代表類的方法

4、Constructor類:代表類的構造方法

5、Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法

 

* 對於修改靜態常量類型是需要小心

對於基本類型的靜態常量,JAVA在編譯的時候就會把代碼中對此常量中引用的地方替換成相應常量值


* 參考閱讀
http://www.imooc.com/learn/199
https://blog.csdn.net/u010832551/article/details/74202467
http://wiki.jikexueyuan.com/project/java-reflection/jave-guide.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM