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

标签 java scala scala-compiler

因为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/

相关文章:

scala - 了解 Scala GADT 支持的限制

scala - 将闭包传递给 Scala 编译器插件

java - 为新的 Spring MVC 项目选择 Thymeleaf 和 A​​ngular

java - 检查当前时间是否距离 "last_updated"时间超过一个小时

c# - Scala 相当于 C# 中的 `??` 运算符

linux - Activator Active Stocks 入门应用程序无法运行并出现 java.io.IOException?

xml - Scala - 修改 xml 中的嵌套元素

java - 通用参数 'extends' 多个类

java - MySQL(谷歌云SQL) : User Access denied only from Java