java - 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 类的属性呢?
解决方案
这绝对是一种奇怪的行为,但更多地探索它似乎与 Kotlin/Java 互操作无关。事实上,它专门只返回类中可访问属性的集合,因此 Java 字段是私有的这一事实将它们排除在外。
该members
函数实际上使这更清楚地说它返回:
此类中可访问的所有函数和属性,包括在此类及其所有超类中声明的函数和属性。
为了说明我的观点,如果您将其中一个属性设为KotlinSubClassWithInstanceMembers
私有,那么从 的子类KotlinSubClassWithInstanceMembers2
中KotlinSubClassWithInstanceMembers
,该私有属性不再包含在从members
或返回的集合中memberProperties
。
open class KotlinSubClassWithInstanceMembers : JavaSuperClassWithInstanceMembers() {
private val subClassReadonlyProperty: Int
get() = 0
}
class KotlinSubClassWithInstanceMembers2: KotlinSubClassWithInstanceMembers() {
val subClassProperty2: Int = 0
}
这里KotlinSubClassWithInstanceMembers2::class.members
不包括subClassReadonlyProperty
。
推荐阅读
- node.js - 表单发送空对象
- sql - 从规范化数据库中选择时重复行
- r - 在 optim() 中实现要优化的参数的标准
- python - OptionMenu add_command 需要直接命令吗?
- reactjs - React highcharts无法从数据标签onclick调用函数
- typescript - 调用 createHttpLink 时获取的类型不匹配
- python - 将 subprocess.run 输出重定向到文件
- api - 问:如何从 YouTube API 获取 YouTube 视频缩略图?
- angular - 如何在 Angular 表单组中嵌套 ControlValueAccessor 组件
- python-3.x - 使用 Pandas 链接嵌套的 json 数据