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