首页 > 解决方案 > Kotlin - memberProperties 应该包括在 java 超类中声明的合成属性

问题描述

考虑以下 Java 类...

public class JavaSuperClassWithInstanceMembers {
    private final int superClassReadonlyProperty = 0;
    private int superClassMutableProperty = 0;

    public int getSuperClassReadonlyProperty() {
        return superClassReadonlyProperty;
    }

    public int getSuperClassMutableProperty() {
        return superClassMutableProperty;
    }

    public void setSuperClassMutableProperty(int value) {
        superClassMutableProperty = value;
    }

    public void superClassInstanceFunction() {
    }
}

现在让我们得到它memberProperties...

println(JavaSuperClassWithInstanceMembers::class.memberProperties)

val test.JavaSuperClassWithInstanceMembers.superClassReadonlyProperty: kotlin.Int,

var test.JavaSuperClassWithInstanceMembers.superClassMutableProperty: kotlin.Int

现在考虑以下 Kotlin 类。请注意,它扩展了 Java 类(上图)...

class KotlinSubClassWithInstanceMembers : JavaSuperClassWithInstanceMembers() {

    val subClassReadonlyProperty: Int
        get() = 0

    var subClassMutableProperty: Int
        get() = 0
        set(value: Int) {}

    fun subClassInstanceFunction() {}
}

现在让我们得到它memberProperties...

println(KotlinSubClassWithInstanceMembers::class.memberProperties)

var test.KotlinSubClassWithInstanceMembers.subClassMutableProperty: kotlin.Int,

val test.KotlinSubClassWithInstanceMembers.subClassReadonlyProperty: kotlin.Int

根据文档

返回在此类及其所有超类中声明的非扩展属性。

那么为什么不memberProperties产生来自 Java 类的属性呢?

标签: javakotlin

解决方案


这绝对是一种奇怪的行为,但更多地探索它似乎与 Kotlin/Java 互操作无关。事实上,它专门只返回类中可访问属性的集合,因此 Java 字段是私有的这一事实将它们排除在外。

members函数实际上使这更清楚地说它返回:

此类中可访问的所有函数和属性,包括在此类及其所有超类中声明的函数和属性。


为了说明我的观点,如果您将其中一个属性设为KotlinSubClassWithInstanceMembers私有,那么从 的子类KotlinSubClassWithInstanceMembers2KotlinSubClassWithInstanceMembers,该私有属性不再包含在从members或返回的集合中memberProperties

open class KotlinSubClassWithInstanceMembers : JavaSuperClassWithInstanceMembers() {

    private val subClassReadonlyProperty: Int
        get() = 0
}
class KotlinSubClassWithInstanceMembers2: KotlinSubClassWithInstanceMembers() {

    val subClassProperty2: Int = 0
}

这里KotlinSubClassWithInstanceMembers2::class.members不包括subClassReadonlyProperty


推荐阅读