簡體   English   中英

Kotlin - memberProperties 應包括在 java super class 中聲明的合成屬性

[英]Kotlin - memberProperties should include synthetic properties declared in java super class

考慮以下 Java class...

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 class。 請注意,它擴展了 Java class(上圖)...

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

根據文檔

返回在此 class及其所有超類中聲明的非擴展屬性。

那么為什么memberProperties也不會產生來自 Java class 的屬性呢?

這絕對是一種奇怪的行為,但更多地探索它似乎與 Kotlin/Java 互操作無關。 實際上,它專門只返回 class 中的可訪問屬性的集合,因此 Java 字段是私有的這一事實不包括它們。

members function 實際上更清楚地說它返回:

在此 class 中可訪問的所有函數和屬性,包括在此 class 及其所有超類中聲明的函數和屬性。


為了說明我的觀點,如果您將KotlinSubClassWithInstanceMembers中的某個屬性設為私有,那么從KotlinSubClassWithInstanceMembers的子類KotlinSubClassWithInstanceMembers2中,該私有屬性將不再包含在從membersmemberProperties返回的集合中。

open class KotlinSubClassWithInstanceMembers : JavaSuperClassWithInstanceMembers() {

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

    val subClassProperty2: Int = 0
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM