我一直在努力並積極使用龍目島2個月。對於Java,我更熟悉一些。但是,我第一次遇到以下語言的語法結構:「@__()」在龍目島的含義是什麼?
@RequiredArgsController(onController = @__(@Autowired))
^^^
這是什麼意思,它是如何編譯的?
我一直在努力並積極使用龍目島2個月。對於Java,我更熟悉一些。但是,我第一次遇到以下語言的語法結構:「@__()」在龍目島的含義是什麼?
@RequiredArgsController(onController = @__(@Autowired))
^^^
這是什麼意思,它是如何編譯的?
這是一個實驗性的Lombok語法,創建時支持引用多個註釋時的間接層,而不是使用Class<?>[]
。
語法有點奇怪;要使用任何3
onX
功能,必須將註釋應用於@__(@AnnotationGoesHere)
中的構造函數/方法/參數。要應用多個註釋,請使用@__({@Annotation1, @Annotation2})
。註釋本身顯然也有參數。
https://projectlombok.org/features/experimental/onX.html
從龍目島開發Roel Spilker的解釋:
它的原因是,javac的已經解決了解析階段的註釋,並給出錯誤,如果它能夠確定註解無效。通過使用不存在的註釋
@__
它不能確定它是假的(它可能由註釋處理器創建)並且不會立即給出錯誤。這讓Lombok有時間完成它的工作,並從代碼中刪除@__
。
其原因是javac已經在解析階段解析了註釋,並給出了錯誤如果它可以確定註釋是無效的。通過使用不存在的註釋'@__',它不能確定它是假的(它可能由註釋處理器創建),並且不會立即給出錯誤。這讓Lombok有時間完成它的工作,並從代碼中刪除'@__'。 –
@RoelSpilker你不想添加自己的答案? – OrangeDog
這意味着生成的構造函數(不是控制器)也會添加@Autowired
註釋,以便Spring可以發揮它的魔力。隨着龍目島,你可以寫你的代碼像
@RequiredArgsConstructor([email protected]__(@Autowired(required=true)))
public class FooController {
private final FooService service;
interface FooService {}
}
和龍目島將其轉換during compilation到
public class FooController {
private final FooService service;
@Autowired(required=true)
public FooController(FooService service) {
this.service = service;
}
}
@__
用於克服註釋的類型限制,因爲
@interface MultipleAnnotations {
Annotation[] value();
}
不起作用因爲所有註釋的超類型本身並不是一個註釋,並且因爲這種超類型本身並不是一個註釋和
@interface MultipleAnnotations {
Class<? extends Annotation>[] value();
}
不允許參數中註解:@MultipleAnnotations(SomeAnnotation.class)
一些挖掘接通這樣的:https://projectlombok.org/features/experimental/onX.html:*在''@__類型是一個註釋參考註釋類型'__'(雙下劃線),它實際上不存在*。雖然我對龍目島一無所知。 ([也是這封郵件](https://groups.google.com/forum/#!topic/project-lombok/PA8V-RNdAcU)) – Tunaki