如何从Java中隐藏Kotlin的lateinit var backing字段?

在Kotlin,假设我有课:

class MyKotlinClass { lateinit var field: String } 

根据文档 :

后期初始化属性也暴露为字段。 该字段的可见性将与lateinit属性设置器的可见性相同。

我可以在java代码中使用myKotlinClass.fieldmyKotlinClass.getField() 。 我想禁用字段访问,并保持只有通过gettersetter访问。

我怎样才能实现这一点,并保持lateinit修饰符?

你可以使用@JvmSynthetic来隐藏来自Java的声明(而不是来自Kotlin)。 只需注释属性的后台字段 :

 @field:JvmSynthetic lateinit var field: String 

虽然该字段在字节码中保持public ,但它也将具有synthetic修饰符,从而防止它在Java源中使用。 然而,这个领域似乎仍然可以通过运行时反思来获得。

另请参见: 关于@JvmSynthetic另一个问题 (虽然没有明确的答案)。

这个问题的经典解决方案是使用属性委托 :

 import kotlin.properties.Delegates class MyKotlinClass { var field: String by Delegates.notNull() } 

这段代码完全是你在问题中所要求的

lateinit字段的可见性来源于相应属性的setter的可见性,所以另一种选择是拥有一个非公有的setter属性:

 lateinit var field: String private set 

这种方法的缺点是在二级以外,制定者本身变得难以接近。