什么语法`@__()`在Lombok中意味着什么?
我一直在和Lombok一起工作并积极使用2个月。 使用Java我更熟悉一点。 但是,我第一次面对语言中的以下语法结构:
@RequiredArgsController(onController = @__(@Autowired)) ^^^
这是什么意思,它是如何编译的?
这是一个实验性的Lombok语法,创建用于在引用多个注释时支持一个间接层,而不是使用Class>[]
。
语法有点奇怪; 要使用3个
onX
function中的任何一个,必须包含要应用于@__(@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 extends Annotation>[] value(); }
不允许注释中的参数: @MultipleAnnotations(SomeAnnotation.class)