【问题标题】:scala - get class/source file name and position of Symbolscala - 获取符号的类/源文件名和位置
【发布时间】:2013-10-13 19:43:59
【问题描述】:

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

【问题讨论】:

  • 这是一个已知问题:issues.scala-lang.org/browse/SI-7044
  • 运行时实际上并不关心源在哪里,因为它在编译的.class 文件上运行。我并不是说不存在“快捷方式”(不是自定义)解决方案,但我真诚地怀疑它是否是标准 if 的一部分。当然,你总是可以开发一个自制算法,但我怀疑这就是你想要的。
  • @TheTerribleSwiftTomato 你认为索引源 jar 并存储类 -> 运行时使用的源关系是个好主意吗?

标签: java scala scala-compiler


【解决方案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 的实现细节,一般情况下您无法知道。

【讨论】:

  • 我详细说明了我的问题。类文件可以通过类型名找到,源文件怎么样,可以看看吗?
猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多