加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

有没有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 – 添加,如果你尝试使用运算符将??有所帮助.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读