日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

lambda表达式优化反射_反射选择器表达式

發(fā)布時間:2023/12/3 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lambda表达式优化反射_反射选择器表达式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。