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

反射 – 通过scala中的字符串名称获取对象实例

发布时间:2020-12-16 09:38:15 所属栏目:安全 来源:网络整理
导读:我需要由字符串名称定义的对象(或“singleton object”或“companion object”…除了类之外的任何东西)。换句话说,如果我有: package myPackageobject myObject 那么有什么像这样的: GetSingletonObjectByName("myPackage.myObject") match { case instan
我需要由字符串名称定义的对象(或“singleton object”或“companion object”…除了类之外的任何东西)。换句话说,如果我有:

package myPackage
object myObject

那么有什么像这样的:

GetSingletonObjectByName("myPackage.myObject") match {
  case instance: myPackage.myObject => "instance is what I wanted"
}

解决方法

Scala仍然缺少反射API。您可以通过加载协同对象类来获取协同对象的实例:

import scala.reflect._
def companion[T](implicit man: Manifest[T]) : T = 
  man.erasure.getField("MODULE$").get(man.erasure).asInstanceOf[T]


scala> companion[List$].make(3,"s")
res0: List[Any] = List(s,s,s)

要获得无类型的伴侣对象,可以直接使用该类:

import scala.reflect.Manifest
def companionObj[T](implicit man: Manifest[T]) = { 
  val c = Class.forName(man.erasure.getName + "$")
  c.getField("MODULE$").get(c)
}


scala> companionObj[List[Int]].asInstanceOf[List$].make(3,s)

这取决于scala被映射到java类的方式。

(编辑:李大同)

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

    推荐文章
      热点阅读