在Eclipse插件中,获取与所选java文件对应的.class文件的正确方法是什么?

时间:2011-09-24 23:51:16

标签: java eclipse eclipse-plugin

我正在编写一个Eclipse插件。我正在寻找获得所选java文件的正确方法,并找到相应的.class文件。

我现在这样做的方式适用于标准的Eclipse java项目,但似乎不太优雅:我调用IJavaProject#getOutputLocation并将其与所选文件的路径相结合。然后我只需将.java更改为.class。

以下是从传入选择转换为路径的方法的代码:

def selection_to_path selection
    path = selection.get_paths.first

    output_location = path.get_first_segment.get_output_location
    root = org.eclipse.core.resources::ResourcesPlugin.getWorkspace().get_root
    folder = root.get_folder output_location
    folder.get_location.to_s

    path_to_file_as_string = path.get_last_segment.get_path.to_s
    path_to_file_as_string[/\.java$/] = ".class"
    path_elements_of_java_file = path_to_file_as_string.split("/")[3..-1]

    all_elements = folder.get_location.to_s.split("/") + path_elements_of_java_file

    File.join(all_elements)
  end

这有效,但我怀疑它经常失败,这不是正确的做法。特别是,getOutputLocation的文档说我对类文件位置的假设过于简单。

那么这样做的正确方法是什么?

我不需要这一直都在工作。当然会有很多情况,.java文件没有相应的.class文件(编译错误,没有自动构建,等等)。我不关心那些;我只想知道是否有类文件,它的完整路径是什么?

1 个答案:

答案 0 :(得分:3)

没有方法可以直接找到相应的类文件资源。获取相应输出文件夹的正确方法是:

  • 将选择转换为IJavaElement,最有可能是ICompilationUnit(.java文件)
  • 找到相应的IPackageFragmentRoot(源文件夹)
  • 找到已解决的IClasspathEntry
  • 使用IClasspathEntry.getOutputLocation()IJavaProject.getOutputLocation()方法查找输出位置,具体取决于类路径条目是否具有单独的输出位置。
  • 根据ICompilationUnit的包
  • 构建类路径的路径

类文件可能存在也可能不存在,具体取决于项目是否已构建,是否存在构建路径错误等。因此,还有其他启发式方法,您需要使用它来确定上述算法的结果是否存在将是可用的。