龙目岛中的语法“@__()”是什么意思?
我已经与龙目岛合作并积极使用2个月了。对于Java,我更熟悉一些。但是,我第一次在语言中遇到以下语法结构:
@RequiredArgsController(onController = @__(@Autowired))
^^^
这是什么意思,它是如何编译的?
我已经与龙目岛合作并积极使用2个月了。对于Java,我更熟悉一些。但是,我第一次在语言中遇到以下语法结构:
@RequiredArgsController(onController = @__(@Autowired))
^^^
这是什么意思,它是如何编译的?
这是一种实验性的龙目岛语法,创建是为了在引用多个注释时支持间接寻址层,而不是使用 .Class<?>[]
语法有点奇怪;要使用 3 个功能中的任何一个,必须将要应用于 构造函数 / 方法 / 参数的注释包装在 中。要应用多个注释,请使用 。注释本身显然也可以有参数。
onX
@__(@AnnotationGoesHere)
@__({@Annotation1, @Annotation2})
https://projectlombok.org/features/experimental/onX.html
龙目岛开发者Roel Spilker的解释:
原因是javac已经在解析阶段解析了注释,如果它可以确定注释无效,则会给出错误。通过使用不存在的注释,它无法确定它是假的(它可能是由注释处理器创建的),并且不会立即给出错误。这让龙目岛有时间完成其工作并从代码中删除。
@__
@__
这意味着生成的构造函数(不是控制器)也将添加注释,以便弹簧可以发挥其魔力。使用龙目岛,您可以编写代码,例如@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)