Как программно найти файл Java в Eclipse от полного имени класса?

В плагине eclipse я хотел бы открыть файл в редакторе. Я знаю полный пакет и имя класса, как из этого определить путь к файлу java?

3 ответа

Решение

Взгляни на IJavaProject.findType( name ) метод. Когда у вас есть ITypeВы можете использовать методы getPath() или getResource(), чтобы найти файл. Этот метод выполняет поиск по проекту и всему, что видно из этого проекта. Чтобы выполнить поиск по всему рабочему пространству, выполните итерацию по всем Java-проектам в рабочем пространстве, вызывая метод findType() для каждого из них по очереди.

Вам также необходимо знать исходную папку.

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

Обычно вы указываете файл для редактора с помощью IFile. Вы также можете запросить у IFile варианты пути к файлу.

Я знаю, что это немного устарело, но у меня была такая же потребность, и я посмотрел, как Eclipse делает это для элементов трассировки стека (на них есть гиперссылка). Код находится в org.eclipse.jdt.internal.debug.ui.console.JavaStackTraceHyperlink (ссылка "ленивая", поэтому открытие редактора разрешается только при нажатии на нее).

Что он делает, так это сначала ищет тип в контексте запущенного приложения, а затем во всем рабочем пространстве (метод startSourceSearch):

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

И затем открывает связанный редактор (метод processSearchResult, source это тип, полученный выше):

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()); 
            }
        }
    }       
}

Код имеет авторское право от затмения. Надеюсь, мне разрешено воспроизвести его, если это упомянуто.

Другие вопросы по тегам