哪些注释目标适用于Java记录?

哪些注释目标适用于Java记录?,java,annotations,java-record,java-16,Java,Annotations,Java Record,Java 16,我有一个用于如下定义的方法或字段的注释: @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, ElementType.FIELD}) public @interface NotColumn { } 我想防止用户在记录上使用此注释,因为在该上下文中使用此注释是没有意义的。似乎这样做不应该编译,因为我没有将ElementType.PARAMETER指定为有效的@Target 不过,以下内容很好: publ

我有一个用于如下定义的方法或字段的注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD})
public @interface NotColumn {
}
我想防止用户在记录上使用此注释,因为在该上下文中使用此注释是没有意义的。似乎这样做不应该编译,因为我没有将
ElementType.PARAMETER
指定为有效的
@Target

不过,以下内容很好:

public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description
}
但是这个带有紧凑构造函数的表单无法使用“java:annotation-type不适用于这种声明”进行编译,这正是我所期望的

public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description
   public MyRecord {
   }
}
description
可能看起来有点像一个参数,但就注释目标而言,严格来说并不仅仅如此。它也可以像一个领域

自(此版本突出显示了与记录相关的已更改部分):

可以传播记录类的记录组件上的注释 中指定的记录类的成员和构造函数

第8.10.3节的要点是,注释(如
@NotColumn
)仅当适用于生成的方法、字段和参数时,才会传播到这些方法、字段和参数上。否则,它们将被忽略。您的注释适用于字段,因此它将传播到记录的生成的
description
字段

而且已经修好了。无论是否指定构造函数,注释的有效性都应该是相同的。在Java的未来版本中,两个示例都可以很好地编译

我想阻止用户在记录上使用此[注释]


这是不可能的,对不起。

谢谢!这对我15岁以下的测试是不好的。它在16岁以下工作正常。没关系,我可以测试并忽略注释并记录该行为。如果注释允许任何目标字段、参数、方法或记录组件,则会将其传播到相应的位置。如果允许多个,则会将其传播到多个位置。如果不允许任何注释,则注释不适用,并导致错误。如果阻止您的意思是不允许用户成功编译代码,则您可以针对您的用例使用
@allargsconstuctor
的示例。实现细节需要在那里跟进。@Naman谢谢,但我的库没有依赖项。对我来说,添加警告日志非常简单,我将对此进行记录。
public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description