什么语法`@__()`在Lombok中意味着什么?

我一直在和Lombok一起工作并积极使用2个月。 使用Java我更熟悉一点。 但是,我第一次面对语言中的以下语法结构:

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

这是什么意思,它是如何编译的?

这是一个实验性的Lombok语法,创建用于在引用多个注释时支持一个间接层,而不是使用Class[]

语法有点奇怪; 要使用3个onXfunction中的任何一个,必须包含要应用于@__(@AnnotationGoesHere)的构造函数/ method /参数的@__(@AnnotationGoesHere) 。 要应用多个注释,请使用@__({@Annotation1, @Annotation2}) 。 注释本身也可以显示参数。

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

Lombok开发人员Roel Spilker的解释:

原因是javac已经在解析阶段解析了注释,并且如果它可以确定注释是无效的则会给出错误。 通过使用不存在的注释@__它不能确定它是伪造的(它可能由注释处理器创建)并且不会立即给出错误。 这使得Lombok有时间完成工作并从代码中删除@__

这意味着生成的构造函数(不是控制器)也会添加@Autowired注释,以便spring可以发挥其魔力。 使用lombok,您可以编写代码

 @RequiredArgsConstructor(onConstructor=@__(@Autowired(required=true))) public class FooController { private final FooService service; interface FooService {} } 

和lombok将在编译期间将其转换为

 public class FooController { private final FooService service; @Autowired(required=true) public FooController(FooService service) { this.service = service; } } 

@__用于克服注释的类型限制,因为

 @interface MultipleAnnotations { Annotation[] value(); } 

不起作用,因为所有注释的超类型本身不是注释和

 @interface MultipleAnnotations { Class[] value(); } 

不允许注释中的参数: @MultipleAnnotations(SomeAnnotation.class)