因为scala类名可能与源文件名不匹配。
How Can I find which .class file in the jar a scala type belongs to.
在 scala.reflect.api.Symbols.Symbol 类型中,有一个名为关联文件的值,但它始终返回 null
scala> typeOf[List[_]].typeSymbol.associatedFile
res4: scala.reflect.io.AbstractFile = null
如何以编程方式获取类文件名?
更详细:如果我得到二进制/源jar,例如scala-library.jar,scala-library-src.jar。如何判断源jar中的哪个源文件来自二进制jar中的类。
Can Scala presentation compiler tell this info ?
最佳答案
linkedFile
返回定义该符号的源文件 - 这在宏中使用,运行时反射没有此类信息,这就是您得到 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
的实现细节,在一般情况下您无法知道。
关于java - scala - 获取类/源文件名和符号位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343272/