[РЕДАКТИРОВАТЬ: я добавил следующую альтернативу - оригинальный ответ отцом вниз]
Во-первых: если вы выбираете что-то в Package Explorer, все выбранные элементы являются объектами Java Model - вам придется иметь дело с ними на каком-то уровне. Есть два способа справиться с этим:
- Используйте ICompilationUnit напрямую (см. Ниже)
- Создание фабрики адаптеров Eclipe для автоматизации преобразования
Адаптер заводского подхода
Вы можете создать фабрику адаптеров (которая может находиться в вашем основном плагине или в другом), которую eclipse может использовать для автоматического преобразования из ICompilationUnit в IFile.
Примечание: если вы создаете фабрику адаптеров в другом плагине, вам, вероятно, потребуется настроить ранний запуск, чтобы загрузить фабрику адаптеров. В противном случае вам потребуется, чтобы ваш плагин, который будет работать с выбором, зависит от плагина, который предоставляет адаптер.
На адаптерах http://www.eclipse.org/resources/resource.php?id=407, есть несколько замечательных деталей, но здесь я расскажу о реализации этой проблемы.
1021 * Зависимость *
Плагину, в котором будет размещен адаптер, необходимы следующие зависимости
org.eclispe.core.resources
org.eclipse.jdt.core
Адаптер заводского класса
Определите следующий класс в вашем новом плагине
package com.javadude.foo;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.jdt.core.ICompilationUnit;
public class CompilationUnitToFileAdapter implements IAdapterFactory {
@Override
public Object getAdapter(Object adaptableObject, Class adapterType) {
if (adaptableObject instanceof ICompilationUnit)
// note: "adapting" it here just means returning the ref'd IFile
return (IFile) ((ICompilationUnit)adaptableObject).getResource();
return null;
}
@Override
public Class[] getAdapterList() {
return new Class[] {IFile.class};
}
}
Расширение
В плагине, в котором будет размещена фабрика адаптеров, добавьте в свой файл plugin.xml следующее:
<extension point="org.eclipse.core.runtime.adapters">
<factory
adaptableType="org.eclipse.jdt.core.ICompilationUnit"
class="com.javadude.foo.AdapterFactory1">
<adapter type="org.eclipse.core.resources.IFile" />
</factory>
</extension>
Использование адаптера
С учетом вышесказанного вы можете написать:
Object firstElement = ((ITreeSelection) selection).getFirstElement();
IFile file = (IFile) Platform.getAdapterManager().
getAdapter(firstElement, IFile.class);
if (file == null)
// adapter not present; cannot use as IFile
else
// adapter present - you can use it as an IFile
Используя этот подход, вы можете добавить дополнительные адаптеры для преобразования других типов в IFile, и ваш код выбора не имеет значения.
Подход Direct ICompilationUnit
[РЕДАКТИРОВАТЬ: я изменяю ответ, но оставляю следующее в качестве справочной информации, поскольку это стандартный способ изучения содержимого модуля компиляции, который был выбран в проводнике пакетов]
На самом деле это предпочтительный способ получения содержимого файла в проводнике пакетов ...
Вместо того, чтобы использовать CompilationUnit, вы должны использовать ICompilationUnit. Большинство API-интерфейсов eclipse используют интерфейсы для общего пользования и классы для внутренних деталей.
Если вы измените свой код на
if (firstElement instanceof ICompilationUnit) {
ICompilationUnit unit = (ICompilationUnit firstElement;
String contents = new String(unit.getContents());
}
Вы будете в хорошей форме.
Чтобы увидеть подробности изучения / изменения модели Java и исходного кода:
(In Eclipse)
Help->
Help Contents->
JDT Plug-in Developer's Guide->
Programmer's Guide->
JDT Core
Это показывает, как правильно работать с моделью Java
Чтобы определить, где вы ссылаетесь на модель Java, вы можете создать адаптер (eclipse), который будет преобразовывать объекты модели Java в файлы. Предполагая, что такой адаптер существует, вы можете попросить AdapterManager преобразовать его в файл Java для вас. Я посмотрю и посмотрю, существует ли он.