Процессор аннотаций Java: Проверьте, реализует ли TypeMirror определенный интерфейс
Я работаю с процессором аннотаций Java. Моя аннотация,@foo
используется для пометки переменных полей,которые могут быть прочитаны в файл или из файла во время выполнения. Однако я хотел бы проверить, реализует ли тип переменной Serializable
во время компиляции, так что если поле не сериализуемо, я могу дать предупреждение/ошибку во время компиляции.
(мне не нужно фактически проверять, является ли объект сериализуемым, если он реализует Serializable
интерфейс, которому я доверяю он.)
я понял, как делать другие вещи, но я не могу понять, как проверить, реализует ли элемент Serializable
. Я могу использовать TypeElement#getInterfaces
метод, но я не могу понять, как проверить, если любой из них TypeMirror
возвращаются те, для Serializable
.
кроме того, если кто-нибудь знает что-нибудь хорошее java.lang.model
или Java аннотации учебники, что было бы полезно, а также.
Edit: я пробовал это...
isSerializable = false
for(TypeMirror tm : processingEnv.getTypeUtils().directSupertypes(em.asType()))
{
if(isSerializable = "java.io.Serializable".equals(tm.toString()))
{
break;
}
}
он работает хорошо для строки и символа, которые непосредственно реализуют Serializable
, но для Integer, который наследует сериализуемый от суперкласса Number, он не работает.
1 ответов
вместо проверки прямых супертипов, вы должны использовать Types.isAssignable
чтобы проверить, если Serializable
и один из супертипов из TypeMirror
:
TypeMirror serializable = elementUtil.getTypeElement("java.io.Serializable").asType();
boolean isSerializable = typeUtil.isAssignable(tm, serializable);