龙目岛中的语法“@__()”是什么意思?

2022-09-01 20:32:57

我已经与龙目岛合作并积极使用2个月了。对于Java,我更熟悉一些。但是,我第一次在语言中遇到以下语法结构:

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

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


答案 1

这是一种实验性的龙目岛语法,创建是为了在引用多个注释时支持间接寻址层,而不是使用 .Class<?>[]

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

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

龙目岛开发者Roel Spilker的解释:

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


答案 2

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

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

龙目岛将在编译期间将其转换为

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)


推荐