scala - 获取符号的类/源文件名和位置

时间:2013-10-13 08:34:18

标签: java scala scala-compiler

因为scala类名称可能与源文件名不匹配。

  

如何在jar中找到scala类型所属的.class文件。

在scala.reflect.api.Symbols.Symbol类型中,有一个名为associatedFile的值,但它总是返回null

scala> typeOf[List[_]].typeSymbol.associatedFile
res4: scala.reflect.io.AbstractFile = null

如何以编程方式获取类文件名?

更详细:如果我得到二进制/源jar,例如scala-library.jar,scala-library-src.jar。如何判断源jar中的哪个源文件来自二进制jar中的类。

  

Scala演示编译器可以告诉此信息吗?

1 个答案:

答案 0 :(得分:1)

associatedFile返回定义符号的源文件 - 这在宏中使用,运行时反射没有这样的信息,这就是你得到null的原因。

如果您使用的是Scala运行时反射,则可以获取相应的java.lang.Class对象:

import scala.reflect.runtime.universe._
val mirror = runtimeMirror(getClass.getClassLoader)
val clazz = mirror.runtimeClass(typeOf[List[_]])

完全限定的类名应该以相当直接的方式映射到相对的类文件路径:

clazz.getName.replace('.', '/') + ".class"

但是你应该知道运行时类并不总是从类文件加载,各种类加载器可以通过多种方式从许多不同的源中获取它们(例如,在运行时动态生成它们)。此外,类文件的确切位置是ClassLoader的实现细节,在一般情况下您无法知道。