Kotlin 使用@field:SerializedName注释而不是@SerializedName的目的是什么?

Kotlin 使用@field:SerializedName注释而不是@SerializedName的目的是什么?,kotlin,serialization,annotations,gson,Kotlin,Serialization,Annotations,Gson,通常,我使用@SerializedName注释来映射JSON字段。但是,在Google架构组件示例项目中,我看到他们使用了@field:SerializedName注释,我找不到任何地方可以阅读使用该@field注释的目的 我是Kotlin的新手,有人能解释或分享参考链接阅读吗?多谢各位 @实体( 指数=[ 索引(“id”), 索引(“所有者登录”)], primaryKeys=[“名称”,“所有者\登录”] ) 数据类回购( val id:Int, @字段:SerializedName(“名称

通常,我使用
@SerializedName
注释来映射JSON字段。但是,在Google架构组件示例项目中,我看到他们使用了
@field:SerializedName
注释,我找不到任何地方可以阅读使用该
@field
注释的目的

我是Kotlin的新手,有人能解释或分享参考链接阅读吗?多谢各位

@实体(
指数=[
索引(“id”),
索引(“所有者登录”)],
primaryKeys=[“名称”,“所有者\登录”]
)
数据类回购(
val id:Int,
@字段:SerializedName(“名称”)
val name:String,
@字段:SerializedName(“全名”)
val fullName:String,
@字段:SerializedName(“说明”)
val说明:字符串?,
@字段:SerializedName(“所有者”)
@字段:嵌入(前缀=“所有者”)
val所有者:所有者,
@字段:SerializedName(“星探计数”)
瓦尔星:Int
) {...
这可能会有帮助:

在对属性或主构造函数参数进行注释时,有多个Java元素是从相应的Kotlin元素生成的,因此在生成的Java字节码中有多个可能的注释位置。要指定如何准确生成注释,请使用以下语法:


为了简化,假设您有:

数据类回购(
@字段:SerializedName(“名称”)
变量名称:String
)
这是在.Kotlin属性中声明一个类,并声明该类被编译成一个字段、getter方法,如果是可变的(即
var
)-setter方法。由于属性在主构造函数中声明,因此它也被编译为构造函数的参数。这一切都意味着可以将注释放置在此上下文中的许多位置:Kotlin属性、backing字段、getter方法、构造函数参数、setter方法或setter参数e> 字段:使注释显式地应用于属性的。从:

#注释使用站点目标

在对属性或主构造函数参数进行注释时,有多个Java元素是从相应的Kotlin元素生成的,因此在生成的Java字节码中有多个可能的注释位置。要指定如何准确生成注释,请使用以下语法:

类示例(@field:Ann val foo,//注释Java字段
@get:Ann val bar,//注释Java getter
@param:Ann val qux)//注释Java构造函数参数
可以使用相同的语法对整个文件进行注释。为此,请将带有目标
文件
的注释放在文件的顶层,放在package指令之前,或者如果文件位于默认包中,则放在所有导入之前:

@文件:JvmName(“Foo”)
包org.jetbrains.demo
如果有多个注释具有相同的目标,可以通过在目标后添加括号并将所有注释放在括号内来避免重复目标:

类示例{
@set:[注入可见的测试]
var合作者:合作者
}
支持的使用站点目标的完整列表为:

  • 文件
  • 属性
    (具有此目标的注释对Java不可见)
  • 字段
  • get
    (属性getter)
  • 设置
    (属性设置器)
  • 接收器
    (扩展函数或属性的接收器参数)
  • param
    (构造函数参数)
  • setparam
    (属性设置器参数)
  • 委托
    (存储委托属性的委托实例的字段)
要注释扩展函数的接收器参数,请使用以下语法:

fun@receiver:Fancy String.myExtension(){…}
如果未指定使用站点目标,则将根据所用批注的
@target
批注选择目标。如果存在多个适用目标,则使用以下列表中的第一个适用目标:

  • param
  • 属性
  • 字段
虽然使用
@field:SerializedName(…)并不是不正确的
在这种情况下,它是不必要的:无论是否添加
字段:
,都会生成相同的字节码,因为无论哪种方式,都只有私有支持字段会得到注释。我从未见过一个实际的项目在野外更喜欢
@field:SerializedName
而不是
@SerializedName
,我认为谷歌的例子对初学者来说是不必要的困惑。你可以忽略它

class Example(@field:Ann val foo,    // annotate Java field
              @get:Ann val bar,      // annotate Java getter
              @param:Ann val quux)   // annotate Java constructor parameter