因为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演示编译器可以告诉此信息吗?
答案 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
的实现细节,在一般情况下您无法知道。