如何以完整的类名从eclipse中以编程方式查找java文件?

时间:2012-08-03 18:51:49

标签: eclipse plugins eclipse-plugin eclipse-pde

在eclipse插件中,我想在编辑器中打开一个文件。我知道完整的包和类名,如何从中确定java文件的路径?

3 个答案:

答案 0 :(得分:5)

查看IJavaProject.findType( name )方法。获得IType后,可以使用getPath()或getResource()方法来查找文件。此方法搜索项目以及该项目中可见的所有内容。要搜索整个工作区,请遍历工作区中的所有Java项目,依次调用每个项目的findType()方法。

答案 1 :(得分:1)

您还需要知道源文件夹。

IProject prj = ResourcePlugin.getWorkspace().getRoot().getProject("project-name");
IFile theFile = prj.getFile(sourceFolder + packageName.replace('.','/') + className + ".java");

通常,您为具有IFile的编辑器指定文件。您也可以向IFile询问文件路径的变体。

答案 2 :(得分:0)

我知道这有点旧,但我有同样的需求,我看看eclipse如何为堆栈跟踪元素做它(它们上面有一个超链接)。代码在org.eclipse.jdt.internal.debug.ui.console.JavaStackTraceHyperlink中(链接是“懒惰的”,因此只有在单击时才能解析打开的编辑器。)

它的作用是首先在启动的应用程序的上下文中搜索类型,然后在整个工作区(方法startSourceSearch)中搜索:

IType result = OpenTypeAction.findTypeInWorkspace(typeName, false);

然后打开关联的编辑器(方法processSearchResultsource是上面检索的类型):

protected void processSearchResult(Object source, String typeName, int lineNumber) {
    IDebugModelPresentation presentation = JDIDebugUIPlugin.getDefault().getModelPresentation();
    IEditorInput editorInput = presentation.getEditorInput(source);
    if (editorInput != null) {
        String editorId = presentation.getEditorId(editorInput, source);
        if (editorId != null) {
            try { 
                IEditorPart editorPart = JDIDebugUIPlugin.getActivePage().openEditor(editorInput, editorId);
                if (editorPart instanceof ITextEditor && lineNumber >= 0) {
                    ITextEditor textEditor = (ITextEditor)editorPart;
                    IDocumentProvider provider = textEditor.getDocumentProvider();
                    provider.connect(editorInput);
                    IDocument document = provider.getDocument(editorInput);
                    try {
                        IRegion line = document.getLineInformation(lineNumber);
                        textEditor.selectAndReveal(line.getOffset(), line.getLength());
                    } catch (BadLocationException e) {
                        MessageDialog.openInformation(JDIDebugUIPlugin.getActiveWorkbenchShell(), ConsoleMessages.JavaStackTraceHyperlink_0, NLS.bind("{0}{1}{2}", new String[] {(lineNumber+1)+"", ConsoleMessages.JavaStackTraceHyperlink_1, typeName}));  //$NON-NLS-2$ //$NON-NLS-1$
                    }
                    provider.disconnect(editorInput);
                }
            } catch (CoreException e) {
                JDIDebugUIPlugin.statusDialog(e.getStatus()); 
            }
        }
    }       
}

Code拥有eclipse的版权。如果提到这一点,我可以允许我再现它。