Spring with Kotlin-开放类中的final方法无法访问成员变量

时间:2019-05-14 19:36:59

标签: spring kotlin

我有一个班级发言-

@Component
open class Foo @Autowired constructor(bar: Bar) {

    private val myList = listOf(1,2,3)

    open fun readFirst() {
        println(myList[0])
    }

    fun readAll() {
        myList.forEach { i -> println(i) }
    }
}

方法readFirst可以正常工作,并且能够访问myList,但方法readAll会为myList引发空指针异常。

如果我打开readAll或通过删除open关键字来使类和readFirst final成为可能,那么它也可以正常工作。

这是否有原因,或者这是一个错误。

注意:这不是失败的确切代码,但这是发生情况的一个示例。

1 个答案:

答案 0 :(得分:0)

这可能是因为Spring框架通过创建隐藏的子类和覆盖方法来发挥其魔力。

与Java不同,Kotlin对于类和方法默认为非开放式(Java称为final),并且需要open关键字才能将它们打开。通常,这是一件好事™,但正如您发现的那样,会破坏Spring。

解决此问题的一种方法是将所有此类和方法标记为open

但是使用compiler plug-in更容易。这样会自动打开所有使用特定Spring注释的类。