一些背景 - 我正在尝试编写一种覆盖来自服务器的值的通用方法,而不确切地知道应该在哪个类中设置它们。所以我正在做的是:
我查看从服务器获得的键/值,然后我开始查找(迭代)“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>
我意识到我需要在实例上调用方法而不是类类型 - 但是如果我不知道在运行时我正在处理什么类,我该怎么办呢?
(尝试构建在不同类中设置值的通用方法)
答案 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))
}