gpt4 book ai didi

reflection - Scala:如何动态实例化对象并使用反射调用方法?

转载 作者:行者123 更新时间:2023-12-03 06:04:56 25 4
gpt4 key购买 nike

在 Scala 中,动态实例化对象并使用反射调用方法的最佳方式是什么?

我想要执行以下 Java 代码的 Scala 等效操作:

Class class = Class.forName("Foo");
Object foo = class.newInstance();
Method method = class.getMethod("hello", null);
method.invoke(foo, null);

上面的代码中,类名和方法名都是动态传入的。上述 Java 机制可能适用于 Foohello(),但 Scala 类型与 Java 类型并不一一匹配。例如,可以为单例对象隐式声明一个类。 Scala 方法还允许使用各种符号作为其名称。两者都是通过名称修改来解决的。请参阅Interop Between Java and Scala .

另一个问题似乎是通过解决重载和自动装箱来匹配参数,如 Reflection from Scala - Heaven and Hell 中所述。 。

最佳答案

有一种更简单的方法来反射调用方法,而无需调用 Java 反射方法:使用结构类型。

只需将对象引用转换为具有必要方法签名的结构类型,然后调用该方法:不需要反射(当然,Scala 在底层进行反射,但我们不需要这样做)。

class Foo {
def hello(name: String): String = "Hello there, %s".format(name)
}

object FooMain {

def main(args: Array[String]) {
val foo = Class.forName("Foo").newInstance.asInstanceOf[{ def hello(name: String): String }]
println(foo.hello("Walter")) // prints "Hello there, Walter"
}
}

关于reflection - Scala:如何动态实例化对象并使用反射调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1469958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com