2014-01-29 5 views
5

Я хочу рассчитать имя пакета для класса Scala.Scala reflection получить имя пакета

ниже код работает, но кажется немного многословный

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(":") 
    } 

Есть ли лучший способ сделать это?

ответ

5

Понятие обхода цепи владельца, пока вы не нажмете на пакет (или, точнее, класс пакета), не верны, однако код, который вы опубликовали, имеет незначительные стилистические проблемы. Во-первых, есть Symbol.fullName, который объединяет строки для вас. Во-вторых, магические имена, необходимые для публичного потребления API отражения, обычно отображаются где-то в API.

Вот как бы я делать то, что вы пытаетесь сделать (изменение newTermName к TermName, если вы на Scala 2.10.x):

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 
+0

Спасибо за обратную связь –

+0

Один вопрос, как я могу получить 'TermName', похоже, хранится в scala.reflect.internal (я на scala 2.10.3) –

+0

Чтобы его скомпилировать, я переписал его так: https://gist.github.com/picsolvebryan/8707151 –

Смежные вопросы