lambda表达式优化反射_反射选择器表达式
lambda表達(dá)式優(yōu)化反射
Java :: Geci是一個在單元測試期間運(yùn)行的代碼生成器。 如果生成的代碼適合源代碼的實際版本,則測試不會失敗。 如果需要進(jìn)行任何修改,則測試將修改源代碼并失敗。 例如,存在一個需要setter和getter的新字段,然后訪問器生成器將生成新的setter和getter,然后失敗。 如果沒有新字段,那么生成的代碼就是已經(jīng)存在的代碼,沒有理由觸摸源代碼:啟動生成器的測試成功完成。
因為Java :: Geci生成器在運(yùn)行時作為測試運(yùn)行,并且因為它們需要訪問為其生成代碼的Java代碼結(jié)構(gòu),所以Java反射是這些生成器的關(guān)鍵。
為了幫助代碼生成器執(zhí)行任務(wù), javageci-tools模塊中提供了許多支持方法。
com.javax0.geci javageci-tools 1.1.1在本文中,我將在此模塊中編寫一個類: Selector ,可以幫助您基于邏輯表達(dá)式選擇字段,方法或類。
介紹
類javax0.geci.tools.reflection.Selector有點像正則表達(dá)式類Pattern 。 您可以創(chuàng)建一個調(diào)用靜態(tài)方法compile(String expression)的實例。 在實例上,您可以調(diào)用match(Object x) ,其中x對象可以是Field , Method或Class ,也可以是任何這些對象的強(qiáng)制轉(zhuǎn)換(我們將其稱為CFoM)。 如果x符合已編譯的表達(dá)式,則match()方法將返回true 。
選擇器表達(dá)式
該表達(dá)式是一個Java字符串。 可以與任何CFoM匹配的簡單至true 。 同樣, false將不匹配任何內(nèi)容。 到目前為止,微不足道。 表達(dá)式可以包含其他條件。 public , private volatile等可以用于匹配具有任何修飾符的CFoM。 如果您在CFoM上使用諸如volatile的東西而不能是volatile(類或方法),則將得到IllegalArgumentException。
對于課程,您可以具有以下條件:
- interface當(dāng)類是接口
- primitive時,它是一個基本類型
- annotation時為注釋
- anonymous
- array
- enum
- member
- local
也許您可能會查找成員類和本地類。 學(xué)習(xí)一點Java永遠(yuǎn)不會太晚。 在開發(fā)此工具之前,我不知道是否可以查詢類是否是本地類。
這些條件很簡單。 您也可以使用模式匹配。 如果編寫extends ~ /regex/ ,它將僅匹配擴(kuò)展名稱與正則表達(dá)式regex匹配的類的類。 您還可以將name , simpleName和canonicalName與正則表達(dá)式進(jìn)行匹配。 如果我們的CFoM x是一個方法或字段,則檢查返回類型,除非是name因為它們也有一個名字。
條件
有很多條件可以使用,這里我只列出一個子集。 包含所有單詞的詳細(xì)文檔位于https://github.com/verhas/javageci/blob/master/FILTER_EXPRESSIONS.md
這是一個開胃菜:
protected , package , static , public , final , synthetic ,
synchronized , native , strict , default , vararg , implements ,
overrides , void , transient , volatile , abstract
表達(dá)結(jié)構(gòu)
檢查一件事情不會太有幫助。 并且還將方法compile()的參數(shù)稱為“表達(dá)式”表明存在更多內(nèi)容。
您可以將條件組合成完整的邏輯表達(dá)式。 您可以創(chuàng)建一個選擇器Selector.compile("final | volatile")來匹配所有線程安全的字段,這些字段可以是final或volatile或兩者都是(在Java中是不可能的,但是選擇器表達(dá)式不會在意)。 您也可以說Selector.compile("public & final & static")以僅匹配那些public , final和static字段。 或者,您可以Selector.compile("!public & final & static")來匹配final和static字段,這些字段是private , protected或package private,也稱為“ not public”。 您還可以應(yīng)用括號,并使用括號來構(gòu)建相當(dāng)復(fù)雜的邏輯表達(dá)式。
用
該用法可以是任何嚴(yán)重依賴反射的應(yīng)用程序。 在Java :: Geci中,該表達(dá)式可以在任何為該方法或類的字段生成一些代碼的生成filter參數(shù)中使用。 在這種情況下, filter可以選擇需要代碼生成的字段或方法。 例如,在訪問器生成filter的情況下, filter的默認(rèn)值為true :為所有字段生成設(shè)置器和獲取器。 如果只需要專用字段的設(shè)置方法和獲取方法,則可以指定filter="private" 。 如果您還想排除最終字段,則可以編寫`filter =”!final&private”。 在這種情況下,您將無法獲得最終字段的吸氣劑。 (默認(rèn)情況下根本不會為最終字段生成設(shè)置程序。生成器很聰明。)
使用流,非常容易編寫表達(dá)式,例如
Arrays.stream(TestSelector.class.getDeclaredFields()) .filter(Selector.compile( "private & primitive" .filter(Selector.compile( "private & primitive" )::match) .collect(Collectors.toSet());它將返回私有和原始的字段集。 請注意,在這種情況下,您會有一些選擇器編譯開銷(盡管對于流來說只有一次),并且在某些情況下,性能可能不可接受。
實驗一下,看看它是否適合您的需求。
我只是忘了補(bǔ)充:您還可以在運(yùn)行時調(diào)用selector(String,Function)和/或selectorRe(String,Function)方法來擴(kuò)展選擇器。
翻譯自: https://www.javacodegeeks.com/2019/06/reflection-selector-expression.html
lambda表達(dá)式優(yōu)化反射
總結(jié)
以上是生活随笔為你收集整理的lambda表达式优化反射_反射选择器表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美国联邦贸易委员会发公告,继续阻止微软收
- 下一篇: maven原型_创建自定义Maven原型