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

时间:2016-06-27 16:28:12

标签: java lombok

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

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

这意味着什么,以及如何编译?

2 个答案:

答案 0 :(得分:14)

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

  

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

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

来自Lombok开发者Roel Spilker的解释:

  

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

答案 1 :(得分:7)

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

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

并且lombok会将其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)