当前位置: 首页 > 知识库问答 >
问题:

为什么在Kotlin中使用类成员属性反射?

廉博赡
2023-03-14

在“Kotlin in Action”中,它说“如果一个成员属性引用了Person类的年龄属性,memberProperty.get(person)是一种动态获取person.age值的方法”,代码为(10.2.1 Kotlin Reflection API):

class Peron(val name: String, val age: Int)
>> val person = Person("Alice", 29)
>> val memberProperty = Person::age
>> println(memberProperty.get(person))
29

我不明白为什么这个例子提到“动态”获取属性的值。当我运行以下代码时,它才起作用:

println(person.age)

是否有其他成员属性反射的案例或示例?

共有1个答案

丌官远
2023-03-14

例如,假设您想编写一个函数来打印一个对象的所有属性及其值,您可以这样做:

inline fun <reified T: Any> T.printProperties() {
    T::class.memberProperties.forEach { property ->
        println("${property.name} = ${property.get(this)}") // You can't use `this.property` here
    }
}

用法:

data class Person(val firstName: String, val lastName: String)
data class Student(val graduate: Boolean, val rollNumber: Int)

fun main() {
    val person = Person("Johnny", "Depp")
    val student = Student(false, 12345)
    person.printProperties()
    student.printProperties()
}

输出:

firstName = Johnny
lastName = Depp
graduate = false
rollNumber = 12345
 类似资料:
  • 随着Java7的发布,出现了,它允许用户像使用底层字节码一样调用方法。特别是,类提供工厂方法来创建方法句柄以访问类成员: 查找对象上的工厂方法对应于方法、构造函数和字段的所有主要用例。工厂方法创建的每个方法句柄都是特定字节码行为的功能等价物。 那么,有没有理由仍然使用像/这样的反射功能,或者这些方法由于引入了更快的方法句柄而实际上已经过时了? 注意,虽然方法句柄是在Java7中引入的,但我的问题主

  • 代码B是一个定制的回收视图apater,带有单选按钮。 mCustomAdapter 在 Code A 中的 fun methodA() 和 fun methodB() 中都发生了变化,因此 的引用也发生了变化,这意味着 val 属性 mySelectedIndex 从不同的地址获取值。 在我看来,val属性不能更改,为什么应用程序不会导致错误? 代码A 代码B 被改进的 我觉得代码DD和代码EE

  • 问题内容: 为什么在JavaScript中不推荐使用该属性? 它是在JavaScript中添加然后弃用的,但ECMAScript完全省略了它。某些浏览器(Mozilla,IE)一直都支持该浏览器,并且在地图上没有删除支持的计划。其他浏览器(Safari,Opera)已对此提供支持,但较旧的浏览器支持不可靠。 是否有充分的理由将这种有价值的功能置于边缘? (或者,是否有更好的方法来抓住调用函数的句柄

  • 我想知道是否可以在同伴对象中使用类的属性。例如,以贝娄为例: 我不能通过c1或C2调用changeAge()函数。我可以使用changeAge的唯一地方是通过Person1.changeAge(),当Person1还没有用适当的构造函数实例化时。我想知道这些动作是不是有其他的选择,或者是没有,有同伴对象有什么意义呢

  • 问题内容: 我刚刚用来为我的JPA2实体生成MetaModel。 有人可以解释为什么在这种情况下将属性标记为易失性吗? 谢谢。 问题答案: 设置静态变量的线程可能与用于访问它们的线程不同,因此需要使用修饰符在所有线程之间同步内存。 没有的情况是这样的: 在初始化JPA提供程序之前,您的线程将访问变量,并获取静态字段 JPA提供程序是从其他线程初始化的,并将静态字段设置为非空值 您的线程再次访问静态

  • 问题内容: 我找到了一个响应式电子邮件模板的示例,其中有诸如此类的CSS选择器: 如果与以下内容完全相同,为什么要使用此语法: 它对移动浏览器或其他任何影响吗? 问题答案: 该语法是属性选择。 这将选择带有的任何标签。但是,它 不会选择具有的(例如。它仅与_ 该属性完全匹配。 您可能需要阅读必须记住的30个CSS选择器。对于任何有前途的Web开发人员来说,这都是无价之宝。