从Class< *>获取对象实例(反射)

时间:2018-01-04 09:58:45

标签: java reflection kotlin

一些背景 - 我正在尝试编写一种覆盖来自服务器的值的通用方法,而不确切地知道应该在哪个类中设置它们。所以我正在做的是:

我查看从服务器获得的键/值,然后我开始查找(迭代)“User”对象及其所有字段 - 如果其中一个字段与我从服务器获得的字段匹配 - 我需要覆盖它的价值。

其中一个用户字段本身可以是另一个类,如“设置”,然后我需要在设置类上重复迭代,依此类推 - 直到找到匹配。

找到匹配后,我需要设置值。这就是我的问题所在:

尝试在类类型中设置方法但是我被抛出IllegalArgumentException

target.declaredMethods[1].invoke(target, true)

java.lang.IllegalArgumentException: Expected receiver of type test.reflectiveparser.User$Settings, but got java.lang.Class<test.reflectiveparser.User$Settings>

我意识到我需要在实例上调用方法而不是类类型 - 但是如果我不知道在运行时我正在处理什么类,我该怎么办呢?

(尝试构建在不同类中设置值的通用方法)

3 个答案:

答案 0 :(得分:1)

Type是类,您必须创建该类的实例 检查this

Object instance  = type.forName(className).getConstructor().newInstance();

target.declaredMethods[1].invoke(instance,true);

答案 1 :(得分:0)

似乎目标类&lt; T&gt; 类型变量。您应该仅使用 T 对象实例调用 target.invoke 方法,但是您使用 Class&lt; T&gt; 对象。

答案 2 :(得分:0)

如您所知,您需要在实例上调用该方法。在您的情况下,实例是User对象上的一个字段。

例如:

class Settings {
    fun methodToCall(bool: Boolean) = "value is: $bool"
}

class User {
    val settings = Settings()
}

fun main(args: Array<String>) {
    val user = User()

    val field = user::class.java.declaredFields[0]
    field.isAccessible = true // allow access to the field (or you can call the getter method if you prefer)

    // get the value of the settings field
    val settings = field[user]

    // invoke with the instance
    println(field.type.declaredMethods[0].invoke(settings, true))
}