簡體   English   中英

編譯時注釋處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM