Это интересный вопрос, который не имеет простого решения. Я постараюсь описать потенциальное решение, а также немного подробнее описать, как JDT выполняет инкрементную компиляцию.
Сначала немного о JDT:
Да, JDT читает файлы классов для некоторой информации, но только для библиотек, у которых нет исходного кода. И эта информация действительно используется только для помощи в редактировании (помощник по контенту, навигация и т. Д.).
JDT вычисляет инкрементную компиляцию, отслеживая зависимости между модулями компиляции по мере их компиляции. Эта информация о состоянии хранится на диске, извлекается и обновляется после каждой компиляции.
В качестве более полного примера предположим, что после полной сборки JDT определяет, что A.java зависит от B.java, который зависит от C.java.
Если в C.java есть структурное изменение (структурное изменение - это изменение, которое может повлиять на внешние файлы (например, добавление / удаление не закрытого поля или метода)), то B. Java будет перекомпилирован. A.java не будет перекомпилирован, поскольку в B.java не было структурных изменений.
После этого небольшого разъяснения о том, как работает JDT, вот несколько возможных ответов на ваши вопросы:
- Да. Это должно быть сделано через статически доступные глобальные объекты. JDT делает это через объекты JavaCore и JavaModelManager. Если вы не хотите использовать глобальные синглтоны, вы можете получить доступ к вашему хранилищу типов, доступному через экземпляр активатора Bundle вашего плагина. Проект e4 допускает внедрение зависимостей, что, вероятно, даже лучше (но на самом деле не является частью основных API Eclipse).
- Я думаю, что сохранение информации в файловой системе - ваш лучший выбор. Единственный реальный способ определения инкрементных зависимостей компиляции - это полная сборка, поэтому вам нужно где-то сохранить информацию. Опять же, вот как это делает JDT. Информация хранится в каталоге
.metadata
ваших рабочих пространств где-то в плагине org.eclipse.core.resources. Вы можете взглянуть на класс org.eclipse.jdt.internal.core.builder.State
, чтобы увидеть реализацию.
Так что, возможно, это не тот ответ, который вы ищете, но я думаю, что это наиболее перспективный способ решения вашей проблемы.