Импорт модели кода для класса со встроенным перечислением
Я работаю над созданием некоторых классов Java с использованием CodeModel, и у меня возникают проблемы с добавлением операторов импорта для классов, которые имеют встроенный статический Enum
Например, если у меня есть класс и создать переменную экземпляра...
Class<?> clazz = getPackageClass();
cls.field(JMod.PRIVATE, codeModel._ref(sourceClass), "testUnderlying");
Но это создает код, как...
import com.test.platform.xxx.UnderlyingType;
....
private UnderlyingType testUnderlying;
Однако, если у UnderlyingType есть поле enum, для которого я хочу вызвать статический метод (например, valueOf)...
private UnderlyingType.EnumType enum;
...
...
UnderlyingType.EnumType.valueOf(xxx);
это, кажется, сбивает с толку CodeModel и вместо того, чтобы иметь отдельный импорт и переменную экземпляра я получу
private com.test.platform.xxx.UnderlyingType testUnderlying;
Можно ли вызвать статический метод без потери импорта?
Спасибо за вашу помощь!
1 ответ
В коде JCodeModel есть комментарий, в котором упоминается, почему они не импортируют внутренние классы:
/**
* Returns true if the symbol represented by the short name
* is "importable".
*/
public boolean collisions(JDefinedClass enclosingClass) {
// special case where a generated type collides with a type in package java
...
if(c.outer()!=null)
return true; // avoid importing inner class to work around 6431987. Also see jaxb issue 166
}
...
}
Не уверен, что ссылается на 6431987 (возможно, на внутренний SUN bug tracker), но здесь упоминается проблема jaxb:
https://java.net/jira/si/jira.issueviews:issue-html/JAXB-166/JAXB-166.html
Кажется, у них были проблемы с импортом из внутренних классов, сталкивающихся.
Стоит отметить, что этот форк JCodeModel решает эту проблему: https://github.com/UnquietCode/JCodeModel