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

Scala反射派生包名称

发布时间:2020-12-16 09:57:55 所属栏目:安全 来源:网络整理
导读:我想计算 Scala类的包名称. 下面的代码有效,但似乎有点冗长 def packagename(cls:ru.ClassSymbol):String = { def innerPackageName(cls:JavaUniverse#Symbol):List[JavaUniverse#Name] = { if(cls.owner != null cls.owner.isPackage ) { List(cls.name) ::
我想计算 Scala类的包名称.

下面的代码有效,但似乎有点冗长

def packagename(cls:ru.ClassSymbol):String = {
    def innerPackageName(cls:JavaUniverse#Symbol):List[JavaUniverse#Name] = {
      if(cls.owner != null && cls.owner.isPackage  ) {
         List(cls.name) ::: innerPackageName(cls.owner)
      }
      else {
          List(cls.name)
      }
    }
    val owner: JavaUniverse#Symbol = cls.owner
    innerPackageName(owner).filterNot{_.toString == "<root>"}.reverse.mkString(":")
  }

有一个更好的方法吗?

解决方法

遍历所有者链直到您命中包(或更准确地说是包类)的概念是正确的,但是您发布的代码具有轻微的风格问题.首先,Symbol.fullName为您连接字符串.其次,公开使用反射API所需的魔术名称通常会在API中的某处暴露.

以下是我将要执行的操作(如果您使用的是Scala 2.10.x,请将newTermName更改为TermName):

00:08 ~/Projects/Master/sandbox (master)$cat Test.scala
import scala.reflect.runtime.universe._
import scala.reflect.runtime.{currentMirror => cm}

object Test extends App {
  def packageName(sym: Symbol) = {
    def enclosingPackage(sym: Symbol): Symbol = {
      if (sym == NoSymbol) NoSymbol
      else if (sym.isPackage) sym
      else enclosingPackage(sym.owner)
    }
    val pkg = enclosingPackage(sym)
    if (pkg == cm.EmptyPackageClass) ""
    else pkg.fullName
  }
  println(packageName(typeOf[Test.type].member(TermName("packageName"))))
  println(packageName(cm.staticPackage("scala")))
  println(packageName(cm.staticClass("scala.collection.immutable.List")))
}

00:08 ~/Projects/Master/sandbox (master)$sr

scala
scala.collection.immutable

(编辑:李大同)

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

    推荐文章
      热点阅读