有没有Scala功能允许您调用名称存储在字符串中的方法?
发布时间:2020-12-16 09:14:11 所属栏目:安全 来源:网络整理
导读:假设您有一个包含方法名称的字符串,支持该方法的对象和一些参数,是否有一些语言功能允许您动态调用? 类似Ruby的发送参数. 解决方法 你可以用Java中的反射来做到这一点: class A { def cat(s1: String,s2: String) = s1 + " " + s2}val a = new Aval hi = "
假设您有一个包含方法名称的字符串,支持该方法的对象和一些参数,是否有一些语言功能允许您动态调用?
类似Ruby的发送参数. 解决方法
你可以用Java中的反射来做到这一点:
class A { def cat(s1: String,s2: String) = s1 + " " + s2 } val a = new A val hi = "Hello" val all = "World" val method = a.getClass.getMethod("cat",hi.getClass,all.getClass) method.invoke(a,hi,all) 如果您希望在Scala中轻松实现,那么您可以为您做一个类,另外还有一个隐含的转换: case class Caller[T>:Null<:AnyRef](klass:T) { def call(methodName:String,args:AnyRef*):AnyRef = { def argtypes = args.map(_.getClass) def method = klass.getClass.getMethod(methodName,argtypes: _*) method.invoke(klass,args: _*) } } implicit def anyref2callable[T>:Null<:AnyRef](klass:T):Caller[T] = new Caller(klass) a call ("cat","Hi","there") 然而,这样的事情将编译时错误转换为运行时错误(即它本质上是避开类型系统),因此谨慎使用. (编辑:看到在上面的链接中使用NameTransformer – 添加,如果你尝试使用运算符将??有所帮助.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |