[英]Compile-time annotation processing
有沒有辦法在 Java 中進行編譯時注釋處理?
考慮這個例子:
@Name("appName")
private Field<String> appName;
public void setAppName(String name) {
appName.setValue(name);
}
public String getAppName(String name) {
return appName.getValue();
}
public void someFunction() {
String whatFieldName = appName.getName();
}
其中注解Name
將在編譯時處理為Field
設置值,即沒有常見的運行時注解處理。 因此,當appName.getName();
( Field
)被訪問,它將返回鍵入的值。
是的,有,但是,不,它不能更改現有文件。 您可以“插入”編譯器並獲悉任何注釋; 作為其中的一部分,您可以看到簽名(因此,字段聲明、方法簽名、類型等)但沒有內容(因此不是用於初始化字段的表達式,也不是方法聲明的 {} 中的內容),並且您可以制作新文件,甚至是 java 文件,但您不能編輯現有文件。
Project Lombok確實對它們進行了編輯,但這正是使之成為可能的框架。
您可以使用一些瘋狂的技巧。 Lombok 項目使用了一個技巧(將其方式反映到編譯器內部,從那里修復所有內容,在 IDE 中安裝代理和插件)。 另一個技巧是使用 java 源文件作為模板。 You name your class some funky (so if you want, say, public class AppDescriptor
, you'd actually make the java file AppDescriptorTemplate.java
and put public class AppDescriptorTemplate
inside. This file has the annotation precisely as you pasted. Your annotation processor can然后在編譯的時候生成AppDescriptor.java
,把所有方法的impls寫成簡單的pass- AppDescriptorTemplate
(生成一個AppDescriptorTemplate類型的字段,把ADT中的所有方法都復制過來,實現都是單行調用模板類上的那個方法)。模板 class 可以是 package 私有的。在這個特定的場景中,聽起來你幾乎可以僅基於"appName"
生成整個東西。
Lombok 直接插入構建,因此幾乎完全透明,因為您只需鍵入 IDE,它生成的方法就會在您鍵入時出現,而使用XTemplate
技巧的“普通”注釋處理器不起作用方式並要求構建系統每次都啟動。 這可能有點浪費生產力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.