日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反射选择器表达式

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反射选择器表达式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的反射选择器表达式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。