2016-06-27 63 views
9

我一直在努力並積極使用龍目島2個月。對於Java,我更熟悉一些。但是,我第一次遇到以下語言的語法結構:「@__()」在龍目島的含義是什麼?

@RequiredArgsController(onController = @__(@Autowired)) 
             ^^^ 

這是什麼意思,它是如何編譯的?

+1

一些挖掘接通這樣的:https://projectlombok.org/features/experimental/onX.html:*在''@__類型是一個註釋參考註釋類型'__'(雙下劃線),它實際上不存在*。雖然我對龍目島一無所知。 ([也是這封郵件](https://groups.google.com/forum/#!topic/project-lombok/PA8V-RNdAcU)) – Tunaki

回答

10

這是一個實驗性的Lombok語法,創建時支持引用多個註釋時的間接層,而不是使用Class<?>[]

語法有點奇怪;要使用任何3 onX功能,必須將註釋應用於@__(@AnnotationGoesHere)中的構造函數/方法/參數。要應用多個註釋,請使用@__({@Annotation1, @Annotation2})。註釋本身顯然也有參數。

https://projectlombok.org/features/experimental/onX.html

從龍目島開發Roel Spilker的解釋:

它的原因是,javac的已經解決了解析階段的註釋,並給出錯誤,如果它能夠確定註解無效。通過使用不存在的註釋@__它不能確定它是假的(它可能由註釋處理器創建)並且不會立即給出錯誤。這讓Lombok有時間完成它的工作,並從代碼中刪除@__

+3

其原因是javac已經在解析階段解析了註釋,並給出了錯誤如果它可以確定註釋是無效的。通過使用不存在的註釋'@__',它不能確定它是假的(它可能由註釋處理器創建),並且不會立即給出錯誤。這讓Lombok有時間完成它的工作,並從代碼中刪除'@__'。 –

+0

@RoelSpilker你不想添加自己的答案? – OrangeDog

5

這意味着生成的構造函數(不是控制器)也會添加@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)

+0

儘管可以使用'Class []',並且在編譯過程中檢查了'isAnnotation()'。 – OrangeDog

+0

@OrangeDog不允許註釋中的參數 – zapl

+1

lombok團隊[已提交提案](https://projectlombok.org/anyannotation/)將Annotation []添加到批註的可能性,但已被拒絕。也許我們有一天可以恢復它... –