類加載器和反射機制

加載->連接->初始化

每一個類都是Class類的一個對實例對象

類加載器:

Bootstrap ClassLoader: 根類加載器 

加載核心類庫

Extension ClassLoader:擴展類加載器

加載JRE的擴展目錄(%JAVA_HOME%/jre/lib/ext等)

System ClassLoader:系統類加載器

加載來自java命令的-classpath選項、java.class.path系統屬性等

類加載緩衝區,如果緩衝區有此類的class,則返回java.lang.Class 對象 沒有則加載該類到緩衝區

ClassLoader 類加載器是所有加載器的父類出根類加載器;

自定義加載器主要extends ClassLoader override findClass(String  name) 方法;



類A、類B 都是  Class 類的對象

反射:通過邪惡手段破獲一個類的屬性、方法、構造器;

怎麼做?

1.先獲得該類的Class對象

2.通過Class對象獲得 構造器、方法、屬性(public,protected,private都可獲得)

怎麼獲得Class對象呢?

//知道類名 

(1)Class類的靜態方法 forName(String classname);注意理解其中的層次感,classname 爲該類的全限定類名(你懂的)

//有類A,即程序中以及import 或者定義了此類

(2)每個類都有class這個屬性,這個屬性是Class類型的,保存了該類的Class對象。類A.class 屬性(^_^) 就是 類A的 Class對象

//有對象

(3)對象的getClass() 方法 將返回該對象所對應的類的 Class 對象。 

得到了Class如何獲得構造器、方法、屬性?

(1)getConstructor(...)、getConstructors(...);getDeclaredConstructors(..)。。。 四種 返回Constructor 對象

(2)getMethod, getDeclaredMethods。。。同上四種   返回Method對象

(3)getField getDeclaredFields  。。。同上四種    返回Field 對象

(4)get 註解 內部類等等 

通過getxxx方法可以獲得該類中的所有內容;(有沒有中被扒光衣服的感覺?so 不安全?)

既然扒光了該類那麼如何操作該類呢?

第一步當然是創建該類對象

(1)Class類對象的newInstance() 方法 ,該方法默認使用類A的 默認構造器;

(2)獲取指定的Constructor對象,在調用Constructor對象的newInstance

如何調用該類的方法呢?

Method對象有invoke 方法,so當然是調用invoke方法來調用反射獲得的方法啦!

如何控制(get,set)屬性?

Field對象有getxxx ,setxxx方法,接下來我都不好意說了!對就是你想的那樣!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章