Jvm 将SourceFile类属性映射到实际文件系统路径的规范方法

Jvm 将SourceFile类属性映射到实际文件系统路径的规范方法,jvm,javac,.class-file,jdi,Jvm,Javac,.class File,Jdi,SourceFile属性仅包含文件名,而不包含完整路径或相对路径。这并不是很多信息,因为javac将根据声明类的包将.class文件放置在一个可能不相关的目录中(相对于-d参数)。虽然这是在运行时查找和加载类所必需的,但它使.class文件位置仅提示.java文件在源代码树中的位置 报告的文件 方法建议使用启发式方法来获取文件系统路径: 在引用实现中,对于未显式指定源路径的层(Java编程语言层从未指定),返回的字符串是由转换为平台相关路径的该引用类型的包名前缀的SourceName(Strin

SourceFile
属性仅包含文件名,而不包含完整路径或相对路径。这并不是很多信息,因为
javac
将根据声明类的包将
.class
文件放置在一个可能不相关的目录中(相对于
-d
参数)。虽然这是在运行时查找和加载类所必需的,但它使
.class
文件位置仅提示
.java
文件在源代码树中的位置

报告的文件 方法建议使用启发式方法来获取文件系统路径:

在引用实现中,对于未显式指定源路径的层(Java编程语言层从未指定),返回的字符串是由转换为平台相关路径的该引用类型的包名前缀的SourceName(String)

没有比这更好的办法了。当然,如果文件在预期位置不存在,可以搜索源树,检查文件名是否唯一,并将其用作位置。但除此之外,没有太多的选择


是否有其他不明显的方法来解决此问题?

SourceFile属性用于在堆栈跟踪中显示。它从来就不是用来处理你想做的事。有趣的是,我没有考虑过这个。那么,源代码级调试器应该做什么呢?在IDE的情况下,它通常使用IDE自己的编译器和构建系统,因此它确切地知道每个类文件来自何处。无论如何,您都需要这样做才能支持其他常见的IDE功能。@但并非所有代码都是由IDE本身编译的。想想JRE类或第三方库。对于Eclipse,我可以肯定地说它确实使用了
SourceFile
属性(即使对于运行时生成的类也是如此),并应用了一些关于在何处搜索实际源文件的启发式方法。它甚至适用于它不理解语法的源文件。