非常好用的反射框架:reflections

背景

最近在設(shè)計和開發(fā)部門的基礎(chǔ)架構(gòu),需要利用反射技術(shù)找到classpath目錄下所有包含指定注解的類,然后根據(jù)注解配置完成指定的功能赊颠。
最初是想自己寫代碼來實現(xiàn)這些功能,邊查資料邊寫劈彪,整了大半天竣蹦,寫出來的效果自己都不太滿意。一方面是代碼多沧奴,不好維護痘括;另一方面是性能不太好。不過滔吠,在查資料的過程中纲菌,我發(fā)現(xiàn)了一個非常好用的反射框架:reflections。
reflections簡單好用疮绷,性能也不錯驰后,很快就完成了我想要的功能,就是這么優(yōu)秀矗愧!

簡介

Reflections通過掃描classpath灶芝,索引元數(shù)據(jù),并且允許在運行時查詢這些元數(shù)據(jù)唉韭。

使用Reflections可以很輕松的獲取以下元數(shù)據(jù)信息:

  • 獲取某個類型的全部子類
  • 只要類型夜涕、構(gòu)造器、方法属愤,字段上帶有特定注解女器,便能獲取帶有這個注解的全部信息(類型、構(gòu)造器住诸、方法驾胆,字段)
  • 獲取所有能匹配某個正則表達式的資源
  • 獲取所有帶有特定簽名的方法,包括參數(shù)贱呐,參數(shù)注解丧诺,返回類型
  • 獲取所有方法的名字
  • 獲取代碼里所有字段、方法名奄薇、構(gòu)造器的使用

Maven依賴

在pom.xml中添加reflections的依賴:

<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.11</version>
</dependency>
// 實例化Reflections驳阎,并指定要掃描的包名
Reflections reflections = new Reflections("my.project");
// 獲取某個類的所有子類
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
// 獲取包含某個注解的所有類
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);

使用

//scan urls that contain 'my.package', include inputs starting with 'my.package', use the default scanners
Reflections reflections = new Reflections("my.package");

//or using ConfigurationBuilder
new Reflections(new ConfigurationBuilder()
     .setUrls(ClasspathHelper.forPackage("my.project.prefix"))
     .setScanners(new SubTypesScanner(), 
                  new TypeAnnotationsScanner().filterResultsBy(optionalFilter), ...),
     .filterInputsBy(new FilterBuilder().includePackage("my.project.prefix"))
     ...);

掃描子類

Set<Class<? extends Module>> modules = 
    reflections.getSubTypesOf(com.google.inject.Module.class);

掃描注解

//TypeAnnotationsScanner 
Set<Class<?>> singletons = 
    reflections.getTypesAnnotatedWith(javax.inject.Singleton.class);

掃描資源

//ResourcesScanner
Set<String> properties = 
    reflections.getResources(Pattern.compile(".*\\.properties"));

掃描方法注解

//MethodAnnotationsScanner
Set<Method> resources =
    reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class);
Set<Constructor> injectables = 
    reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class);

掃描字段注解

//FieldAnnotationsScanner
Set<Field> ids = 
    reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);

掃描方法參數(shù)

//MethodParameterScanner
Set<Method> someMethods =
    reflections.getMethodsMatchParams(long.class, int.class);
Set<Method> voidMethods =
    reflections.getMethodsReturn(void.class);
Set<Method> pathParamMethods =
    reflections.getMethodsWithAnyParamAnnotated(PathParam.class);

掃描方法參數(shù)名

//MethodParameterNamesScanner
List<String> parameterNames = 
    reflections.getMethodParamNames(Method.class)

掃描方法調(diào)用情況

//MemberUsageScanner
Set<Member> usages = 
    reflections.getMethodUsages(Method.class)

參考資料

https://github.com/ronmamo/reflections

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呵晚,更是在濱河造成了極大的恐慌蜘腌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饵隙,死亡現(xiàn)場離奇詭異撮珠,居然都是意外死亡,警方通過查閱死者的電腦和手機金矛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門芯急,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绷柒,你說我怎么就攤上這事志于。” “怎么了废睦?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵伺绽,是天一觀的道長。 經(jīng)常有香客問我嗜湃,道長奈应,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任购披,我火速辦了婚禮杖挣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刚陡。我一直安慰自己惩妇,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布筐乳。 她就那樣靜靜地躺著歌殃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝙云。 梳的紋絲不亂的頭發(fā)上氓皱,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音勃刨,去河邊找鬼波材。 笑死,一個胖子當著我的面吹牛身隐,可吹牛的內(nèi)容都是我干的廷区。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抡医,長吁一口氣:“原來是場噩夢啊……” “哼躲因!你這毒婦竟也來了早敬?” 一聲冷哼從身側(cè)響起忌傻,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤大脉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后水孩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镰矿,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年俘种,在試婚紗的時候發(fā)現(xiàn)自己被綠了秤标。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宙刘,死狀恐怖苍姜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悬包,我是刑警寧澤衙猪,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站布近,受9級特大地震影響垫释,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撑瞧,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一棵譬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧预伺,春花似錦订咸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至料滥,卻和暖如春然眼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葵腹。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工高每, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人践宴。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓鲸匿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阻肩。 傳聞我的和親對象是個殘疾皇子带欢,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. 簡介 1.1 什么是 MyBatis 运授? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,519評論 0 4
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風情閱讀 1,672評論 0 3
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡書 3.9 Annotation-base...
    SnailTyan閱讀 1,168評論 0 3
  • Spring目前的趨勢是使用注解結(jié)合Java代碼而不是配置來定義行為乔煞、屬性吁朦、功能、規(guī)則和擴展點渡贾,因此梳理注解也是梳...
    墨雨軒夏閱讀 1,170評論 0 30
  • Spring 技術(shù)筆記Day 1 預(yù)熱知識一逗宜、 基本術(shù)語Blob類型,二進制對象Object Graph:對象圖...
    OchardBird閱讀 973評論 0 2