Как получить IType из имени класса в Eclipse JDT

Я реализую вариант мастера JUnit New Test Suite Wizard, и вместо получения тестовых классов из текущего проекта мне нужно получить их из другого источника. Они приходят ко мне в виде строк полных имен классов.

Некоторые из них могут еще не существовать в рабочей области этого пользователя, не говоря уже о пути к классам текущего проекта. Пользователю нужно будет импортировать проекты для них позже, но я пока не хочу возиться с этим в своем мастере. Мне нужно просто добавить все классы в новый набор, независимо от того, существуют они еще или нет.

Для тех классов, которые уже находятся в пути к классам этого проекта, я могу использовать IJavaProject.findType(String fullQualifiedName) . Есть ли аналогичный способ получить ITypes для классов, которые (пока) не видны?

Я был бы рад создать IType из ничего, но ITypes, похоже, не любят, когда их создают.


person Daniel Ashton    schedule 09.09.2011    source источник
comment
(Забавно, что голосование за чей-то ответ на мой собственный вопрос не может сделать новый пользователь, такой как я.)   -  person Daniel Ashton    schedule 09.09.2011
comment
На данный момент я обдумываю идею реализации объекта HypotheticalType, реализующего IType. Я надеюсь, что существующему коду мастера на самом деле потребуется лишь несколько методов IType и связанных с ним интерфейсов, которых едва хватит, чтобы рассматривать их как прославленные строки, содержащие имена классов, которые еще предстоит импортировать.   -  person Daniel Ashton    schedule 09.09.2011
comment
Альтернативой, конечно, является серьезная модификация существующего кода мастера для использования вместо него строк. Однако это похоже на решение второго сорта.   -  person Daniel Ashton    schedule 09.09.2011


Ответы (2)


Я не думаю, что это возможно: интерфейсы модели документа Java создаются на основе пути к классам.

Хуже того, если проект не существует в рабочей области пользователя, результирующий код не будет компилироваться, и это еще одна причина, по которой нельзя разрешать произвольное создание таких конструкций.

На вашем месте я бы попытался помочь пользователю импортировать несуществующие проекты в случае, если типы недоступны, избегая, таким образом, решения с моделью документа Java.

person Zoltán Ujhelyi    schedule 09.09.2011
comment
То, что результирующий код не будет сначала компилироваться, в этом случае допустимо. То же самое произойдет, если пользователь вставит нужные строки имени класса в свой новый JUnitTestSuite перед импортом проектов. И я также с нетерпением жду запуска какого-то импорта в будущей итерации этого мастера. Когда я это сделаю, я надеюсь, что смогу найти простой способ заполнить мастер импорта проектов необходимыми проектами. Но это другая тема, чем мой первоначальный вопрос. - person Daniel Ashton; 09.09.2011

Для моих целей создание HypotheticalType и HypotheticalMethod выполнило свою работу. Я прилагаю обзор на случай, если кому-то еще понадобится следовать этому пути.

Сначала я создал HypotheticalType и реализовал интерфейс IType. Я создал экземпляр одного из них в нужном месте в моем модифицированном мастере. Используя представление Outline Eclipse, я создал точку останова для всех методов в моем новом классе. Это позволило мне определить, какие методы действительно вызывались во время выполнения моего мастера. Я также модифицировал конструктор, чтобы он принимал в качестве String имя класса, для обработки которого мне требовался мастер.

В этом упражнении игнорируются почти все новые методы. Я обнаружил, что могу сохранить реализацию по умолчанию (в большинстве случаев возвращать null или false) для всех методов, кроме следующих:

  • конструктор
  • exists() - модификация не требуется
  • getAncestor(int) - модификация не требуется, но может быть полезно вернуть пакет моего гипотетического класса, например. если мой класс java.lang.Object.class, вернуть java.lang.
  • getDeclaringType() - модификация не требуется
  • getElementName() - изменено, чтобы вернуть имя класса, например. если мой класс java.lang.Object.class, вернуть Object.
  • getElementType() - изменено, чтобы вернуть IJavaElement.TYPE
  • getFlags() - еще не изменено, но может быть
  • getMethod(String, String[]) - изменено, чтобы вернуть новый HypotheticalMethod(name)
  • getMethods() - изменено, чтобы вернуть новое IMethod[] { new HypotheticalMethod("dudMethod") }

В процессе я обнаружил, что мне нужно иметь возможность возвращать HypotheticalMethod, поэтому я создал и этот тип, унаследованный от IMethod, и использовал те же методы, чтобы определить, какие методы должны быть реализованы. Это единственные методы, которые вызываются во время работы этого мастера:

  • Конструктор — добавьте параметр String, чтобы ввести имя метода.
  • exists() - модификация не требуется
  • isMainMethod() - модификация не требуется

Это покрывает решение моего первоначального вопроса. Золтан, я буду делать то, что вы предложили, в следующей итерации и попытаюсь помочь пользователю как в случае, когда желаемый класс еще не находится в пути к классам этого проекта, так и в случае, когда желаемый класс находится в каком-то проекте. еще в рабочем пространстве.

person Daniel Ashton    schedule 12.09.2011