java反射機制Reflection詳解
Java語言有好些個名詞,讓人望而生畏。
上智不教即知,下愚雖教無益,中庸之人,不教不知。
人的天性中就有一點對未知的恐懼。
剛開始不了解,也沒認(rèn)真看,發(fā)現(xiàn)好難呀;等,靜下心來自己研究,再看其實不難,發(fā)現(xiàn)都是紙老虎,不堪一擊。
今天就來分析一下反射:Reflection
看一下維基百科的解釋:
在諸如Java之類的面向?qū)ο蟮某绦蛟O(shè)計語言中,反射允許在程序運行期間訪問 類、接口、字段和方法,而不必在編譯期間知道接口、字段或者方法的名稱。
反射也允許實例化對象和調(diào)用方法。
總結(jié)三點:
第一:反射可以獲取類、接口、字段和方法的信息。
第二:不止new可以創(chuàng)建對象,反射也可以實例化對象。
第三:通過反射實現(xiàn)對方法的調(diào)用。
對于創(chuàng)建對象或者調(diào)用方法:正常的步驟是先用new關(guān)鍵詞,造一個對象,然后再使用此對象的引用去調(diào)用方法,這是正常的套路。
反射就是不按正常套路來,但是殊途同歸,本來可以一步到位的東西,他要分幾個詳細(xì)的步驟或者繞個彎走。而他的先獲取Class類對象,再去創(chuàng)建對象仿佛就是分步走。
然后通過Class類對象獲取Method,然后通過Method的invoke方法調(diào)用對象的方法就是在繞個彎。
首先要創(chuàng)建一個Reflection測試類
使用反射創(chuàng)建對象,用new創(chuàng)建對象就沒必要再說了。JavaAPI為反射機制提供了一些類包括Class和java.lang.reflect包下的類。
(1)第一種方式:使用Class類的forName靜態(tài)方法,可以獲取一個類對象,然后調(diào)用類對象的newInstance方法創(chuàng)建對象。
(2)第二種方式:直接使用類名.class獲取類對象,然后調(diào)用類對象的newInstance方法創(chuàng)建對象。
使用反射,獲取類的public方法,并嘗試調(diào)用類的方法。
(1)首先通過反射獲取類對象,通過類對象的getMethods方法,獲取類的所有public方法Method[]。
Method是java.lang.reflect包下的類:提供某個 類、接口 的單一方法信息,提供對方法的訪問。這個反射方法可以獲取類方法或者實例方法。
循環(huán)輸出方法名,可以看到,不止test1、3還有equals、hashCode等繼承Object的方法。
但是并沒有test2,因為他不是public類型的方法。
(2)使用Method的invoke調(diào)用方法test1和hashCode
(3)也可以使用getMethod獲取Method,不過要注意其參數(shù)
第一個參數(shù):方法名
第二個參數(shù):此方法參數(shù)的類型集合
使用反射,獲取類的public字段,和獲取方法類似,也有兩個方法,一個是獲取所有的public字段,另一個是獲取某個public字段
使用反射,獲取類和方法的注解。(Retention(RetentionPolicy.RUNTIME),RUNTIME類型的才能獲取到)
(1)獲取類的注解
(2)獲取方法的注解
相關(guān)文章
java實現(xiàn)新浪微博Oauth接口發(fā)送圖片和文字的方法
這篇文章主要介紹了java實現(xiàn)新浪微博Oauth接口發(fā)送圖片和文字的方法,涉及java調(diào)用新浪微博Oauth接口的使用技巧,具有一定參考接借鑒價值,需要的朋友可以參考下2015-07-07Spring context:component-scan的使用及說明
這篇文章主要介紹了Spring context:component-scan的使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09SpringBoot集成Redis數(shù)據(jù)庫,實現(xiàn)緩存管理
SpringBoot2 版本,支持的組件越來越豐富,對Redis的支持不僅僅是擴展了API,更是替換掉底層Jedis的依賴,換成Lettuce。 本案例需要本地安裝一臺Redis數(shù)據(jù)庫。下面就來看下集成Redis的步驟2021-06-06使用maven一步一步構(gòu)建spring mvc項目(圖文詳解)
這篇文章主要介紹了詳解使用maven一步一步構(gòu)建spring mvc項目,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09