1 回答
TA贡献1785条经验 获得超4个赞
您应该使用适当的使用站点目标来限定注释:
@field:ExcludeFromJSON private var password: String
这将导致注释出现在此属性生成的 Java 字段上。
来自Kotlin Reference regarding Annotation Use-site Targets:
当您注释属性或主要构造函数参数时,有多个 Java 元素是从相应的 Kotlin 元素生成的,因此在生成的 Java 字节码中有多个可能的注释位置。[...]
[...]
支持的使用站点目标的完整列表是:
file
;
property
(具有此目标的注释对 Java 不可见);
field
;
get
(财产获取者);
set
(属性设置器);
receiver
(扩展函数或属性的接收参数);
param
(构造函数参数);
setparam
(属性设置器参数);
delegate
(存储委托属性的委托实例的字段)。[...]
如果您不指定使用站点目标,则根据
@Target
所使用的注释的注释来选择目标。如果有多个适用目标,则使用以下列表中的第一个适用目标:
param
;
property
;
field
.
要摆脱的三件重要事情是:
Kotlin 中的注释在最终应用位置方面存在一定程度的歧义1 。例如,将注释放置在您所做的位置意味着可以将注释应用于至少五个不同位置之一:属性、字段、getter、setter、setter 参数。
应用于 Kotlin 属性的注解在 Java 端是不可见的。
如果 Kotlin 属性上的注解没有 use-site 目标,则仅当它不适用于 Kotlin 属性时才会应用于支持字段。
您的注释在其注释中同时包含AnnotationTarget.FIELD
和。由于您没有指定 use-site 目标,因此该属性优先——这意味着注释对 Java 不可见。AnnotationTarget.PROPERTY
@Target
添加回答
举报