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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容