2

因为 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 演示编译器可以告诉这个信息吗?

4

1 回答 1

1

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

如果你使用的是 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在一般情况下您无法知道的实现细节。

于 2013-10-13T09:49:32.560 回答