亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自動生成替換方法

自動生成替換方法

幕布斯6054654 2023-04-26 17:17:08
在為我正在制作的應用程序創建語言文件時,我遇到了很多樣板代碼。我目前有一個包含所有語言字符串的類,然后我使用反射將這些字符串寫入文件。我經常遇到的是我的字符串中有某些我想替換的占位符,例如我可能有這樣的字符串:public static String USER_INFO = "Username: %name% money: %balance%";我想要實現的是生成一些基于注釋的方法,例如我可以使用 lombok 生成 getters/setters 和其他方法?;谏厦娴淖址視幸粋€名為Arguments(正確地應該命名為 Replacers 或更有意義的東西)的注釋,如下所示:@Retention(RetentionPolicy.SOURCE)@Target(ElementType.FIELD)public @interface Arguments {  String[] value();}我想做的是添加這樣的注釋:@Arguments(        value = {"%balance%", "%name%"})public static String USER_INFO = "Username: %name% - money: %balance%";并獲取以下自動生成的替換方法:public static String USER_INFONameReplacement(String name) {    return USER_INFO.replace("%name%", name);}public static String USER_INFOAllReplacement(String name, String balance) {    return USER_INFO.replace("%name%", name).replace("%balance%", balance);}public static String USER_INFOBalanceReplacement(String balance) {    return USER_INFO.replace("%balance%", balance);}但我似乎無法讓它注冊?所以我的第一個問題是,如果我想實現這個目標,AbstractProcessor 是可行的方法嗎?如果不是那怎么辦?如果是,那為什么不注冊?我正在使用 IntelliJ 并進入設置 -> 構建 -> 編譯器并將注釋處理器更改為啟用并將處理器路徑設置為我的 SuggestProcessor
查看完整描述

2 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

Java Annotation Processing (APT) 插件旨在基于其他類生成代碼。這些類最終位于生成的源文件夾中,該文件夾隨后也會被編譯。這些 APT 插件是從類路徑/構建工具配置中發現的,并且也由 IntelliJ 編譯器運行。請記?。篈PT 用于生成源代碼,根本不是用于替換現有類。Lombok 仍然能夠這樣做的唯一原因是因為他們非常深入地侵入了編譯器,并且通過這種方式能夠在編譯下操作類的 AST。

由于這種方法在未來的 Java 版本中存在很大爭議并且容易出錯,因此任何人都極不可能嘗試構建基于 APT 的類替換框架或能夠做到這一點的 Lombok 擴展(我們不是這是因為 Lombok 是唯一可以被視為此類 APT 使用的“框架”的工具,而 Lombok 本身根本不是以可擴展的方式構建的)。

總之:APT 可能是可行的方法,但您的處理器必須創建一個新類,而不是嘗試修改現有類。

我不確定為什么您當前的注釋處理器沒有與您的編譯器正確關聯。如果您使用的是 Maven,則可以嘗試在本地為您的處理器安裝工件,并將其作為編譯依賴項添加到您的其他項目中。

在 Java 中沒有修改編譯類的真正方法,所以如果你真的必須在同一個類中使用該方法,那么不幸的是,這意味著它無法完成。


查看完整回答
反對 回復 2023-04-26
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

您可以像 Lombok 一樣修改抽象語法樹 (AST),而不是實際創建文件并寫入文件。不建議這樣做,不同的編譯器以不同的方式實現 AST,但您可以從 github ( https://github.com/rzwitserloot/lombok )擴展 Lombok 源代碼,并在需要時制作注釋處理程序。但是,它有點難,因此請確保您確實需要它。


抱歉,我沒有正確閱讀您的問題。要注冊它,您需要在使用注釋和注釋處理器的項目中創建一個 META-INF\services 目錄。在該目錄中,制作一個名為“javax.annotation.processing.Processor”的 txt 文件,其中包含處理器的名稱,例如 mypackage.SuggestProcessor。如果您決定使用 java 9,您還可以在 module-info 文件中聲明處理器。處理器的模塊必須包含“provides javax.annotation.processing.Processor with something.SuggestProcessor”,使用注釋的模塊必須包含“uses javax.annotation.processing.Processor”。這就是 javac 注冊注釋處理器的方式。


查看完整回答
反對 回復 2023-04-26
  • 2 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號