一直以來,多少Java編程人員對於Java的反射諱莫如深,其實簡單粗暴的說,所謂反射就是文件與Java對象之間的轉換而已。 編程
咱們編寫的Java後綴的文件,通過編譯以後就成爲class後綴的文件了,jvm對其進行登記。 jvm
反射的時候,jvm按照花名冊,加載全部相關的class文件。這時候,文件裏面就是代碼,就是對象。 spa
加載以後呢,按照Java規則,將其還原爲咱們熟悉的Java文件,這時候這個class文件就從編譯狀態變成了編程狀態。 對象
實際反射的根本就是文件io。在這個基礎之上,必須理解的是,Java的一切皆是面向對象,連基本數據類型都有對象包裝類。 get
1.得到一個類的類模版 io
Class c = 對象名.getClass(); 編譯
Class c = Class.forName(包名+類名); ---經常使用 class
咱們也能夠根據模版來獲取其對應的類對象: c.newInstance(); 基礎
上面就是從jvm加載的花名冊裏面獲取到class文件,而後調用面向對象的方法,生成對象,class就是編譯後的class文件對應的對象類型。 權限
重點:Class是一個對象。
2.根據類模版獲取類的信息:
獲取類的屬性:
Filed類----c.getFiled(String pname) 得到指定屬性(公共字段)
Filed類----c.getDeclearedFiled(String pname) 得到指定屬性(全部權限字段)
Filed[]----c.getFileds() 得到全部屬性(公共字段)
Filed[]----c.getDeclearedFileds() 得到全部屬性(全部權限字段)
上面是基於對象獲取屬性與字段。
重點:屬性自己也是一個對象。
獲取類的方法:
Method類----c.getMethod(String methodName,class[] params) 得到指定方法(公共方法)
Method類----c.getDeclearedMethod(String methodName,class[] params) 得到指定方法(全部方法)
Method[]----c.getMethods() 得到全部方法(公共方法)
Method[]----c.getDeclearedMethods() 得到全部方法(全部權限方法)
獲取類的方法,同樣是基於對象操做;
重點:方法自己也是對象。
因此,必須深入的理解Java的面向對象的完全與乾脆。
因此反射的本質,就是從Java格式的對象文件到編譯的class文件,而後從編譯的class文件到可編程的Java文件,咱們看得懂的對象文件。編譯的過程就是文件重寫,從一直規則到另外一種規則。反射的時候,就是經過IO進行反向規則還原寫。還原的過程,一切都是從文件到對象的過程。理解類是對象,屬性是對象,方法是對象。