學(xué)習(xí)記錄之Java反射機(jī)制
java反射機(jī)制
反射是java中的動(dòng)態(tài)機(jī)制,它允許我們?cè)诔绦蜻\(yùn)行期間再確定類的實(shí)例化,方法的調(diào)用,屬性的調(diào)用等,而不是傳統(tǒng)意義上的在編碼期間確定。
因此,反射可以大大的提高代碼的靈活度,但是隨之而來的是更多的系統(tǒng)開銷和較慢的運(yùn)行速度,因此不能過度的依賴反射。
Class類
Class的每一個(gè)實(shí)例用于表示JVM加載的一個(gè)類,所以我們也稱Class的實(shí)例?為類的類象。?當(dāng)JVM加載一個(gè)類時(shí)會(huì)同時(shí)實(shí)例化一個(gè)Class的實(shí)例與之對(duì)應(yīng),這個(gè)Class實(shí)例?中會(huì)保存該類的一切信息(類名,有哪些方法,構(gòu)造器,屬性,注解等等)?我們?cè)诔绦蜻\(yùn)行期間通過某個(gè)類的類對(duì)象來操作這個(gè)類。因此使用反射操作某個(gè)?類的第一件事就是獲取該類的類對(duì)象
獲取一個(gè)類的類對(duì)象有三種方式:
1:類名.class 例如: Class cls = String.class; Class cls = int.class (基本類型只能通過這種方式獲取類對(duì)象)
2:Class.forName(String className) 通過Class的靜態(tài)方法forName,傳入對(duì)應(yīng)類的完全限定名(包名.類名)的 形式獲取類對(duì)象 Class cls = Class.forName("java.lang.String");
3:通過類加載器ClassLoader加載類對(duì)象
使用反射機(jī)制進(jìn)行對(duì)象的實(shí)例化
Class提供的方法:
Object newInstance()
該方法可以使用其表示的類的無參構(gòu)造器進(jìn)行對(duì)象實(shí)例化
使用有參構(gòu)造器實(shí)例化對(duì)象
使用反射機(jī)制調(diào)用方法
調(diào)用無參數(shù)方法:
調(diào)用有參方法:
訪問私有方法: