加載->連接->初始化
每一個類都是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方法,接下來我都不好意說了!對就是你想的那樣!