[英]Kotlin - Should reflection work for synthetic properties in Java classes
[英]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
中,該私有屬性將不再包含在從members
或memberProperties
返回的集合中。
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.