1)框架設計的靈魂: 反射
2)框架(半成品軟件):
也許你用框架時,並不需要框架.
3)什麼是反射?
將類的各個組成部分封裝成其它對象,這就是反射機制;
好處:
1.可以在程序運行過程中,操作這些對象:
如:
String str = "abc";
str.xxx 爲何會有提示呢? 就是Method對象了. IDEA就是利用反射機制知道有哪些方法;
2.解耦(降低程序的耦合性,提高程序的可擴展性)
4)Java代碼在計算機中運行經理的3階段:
(1)Person.java
(2)javac編譯java文件
(3)在硬盤上生成了 Person.class 字節碼文件(類名字、成員變量、成員方法、構造等)
1:源代碼階段:
成員變量
構造
成員方法
2: Class類對象階段
Person.class 經過類加載器ClassLoader將Person.class字節碼文件加載到內存中:
有一個對象描述字節碼文件(Class: 描述字節碼文件)
共同的屬性:
成員變量: Field[] fields 對象
構造方法: Contructor[] cons 對象
成員方法: Method[] methods 對象
從而可以創建具體的對象.
3:Person對象(運行時階段)
5)關鍵之處: 獲取字節碼 Class對象, 有3種方式(對應3個階段): 字節碼物理文件 在內存中生成的對象
(1)將字節碼文件加載到內存生成Class對象:
Class.forName("全類名")
用途: 多用於配置文件(字符串),將類名定義在配置文件中,讀取文件,加載類;
(2)已經字節碼文件在內存了,通過類名獲取:
類型.class: 通過類名的屬性獲取
用途: 多用於函數中傳參數
(3)通過Class類對象階段
對象.getClass()方法:
在Object中定義,意味着所有的對象有這個方法;
用途: 多用於對象的獲取字節碼的方式;
用 == 這樣進行地址值的比較;
結論: 同一個字節碼文件(*.class)在一次程序運行過程中,只會被加載一次,不論通過哪一種方式獲取的Class對象
都是同一個.
6)Class對象功能概述:
獲取功能:
1.獲取成員變量們
Field[] getFields()-->獲取public
Field getField(String name)-->獲取指定名稱的public
Field[] getDeclredField(String name)
Field getDeclredField(String name)-->可以獲取所有的,包括私有的. 說明在反射面前,沒有什麼共有私有.
忽略安全(暴力反射): setAccesssible(true)
2.獲取構造方法們
獲取完構造方法,就可以創建對象
Contructor constructor = personClass.getConstructor(String.class, int.class)
constructor.newInstance(xx, xx)
3.獲取成員方法們
作用: 用於執行方法
對象, 參數列表
method.gteName()
4.獲取類名
personClass.getName()-->包名.類名
7)Field:
get(x)
set(x, x )
8)通過字節碼文件對應的類加載器來獲取路徑.
9)通過改物理的配置文件,改一下,能改變程序運行行爲