Обработчик Java Annotations: проверьте, реализует ли TypeMirror определенный интерфейс - программирование

Обработчик Java Annotations: проверьте, реализует ли TypeMirror определенный интерфейс

Я работаю над обработчиком аннотаций Java. Моя аннотация @foo используется для обозначения переменных поля, которые могут быть прочитаны в файле или из файла во время выполнения. Тем не менее, я хотел бы проверить, реализует ли тип переменной Serializable во время компиляции, поэтому, если поле не является сериализуемым, я могу дать предупреждение/ошибку во время компиляции.

(Мне не нужно проверять, действительно ли объект сериализуется, если он реализует интерфейс Serializable, я ему доверяю).

Я выяснил, как это сделать, но я не могу понять, как проверить, реализует ли элемент Serializable. Я могу использовать метод TypeElement#getInterfaces, но не могу понять, как проверить, возвращен ли какой-либо из этих TypeMirror для Serializable.

Кроме того, если кто-нибудь знает какие-либо хорошие учебники java.lang.model или Java Annotations, это также будет полезно.

Изменить: я пробовал это...

isSerializable = false  
for(TypeMirror tm : processingEnv.getTypeUtils().directSupertypes(em.asType()))  
{  
if(isSerializable = "java.io.Serializable".equals(tm.toString()))  
{  
break;  
}  
}  

Он отлично работает для String и Character, которые непосредственно реализуют Serializable, но для Integer, который наследует Serializable из суперкласса Number, он не работает.

4b9b3361

Ответ 1

Вместо проверки прямых супертипов вы должны использовать Types.isAssignable, чтобы проверить, является ли Serializable одним из супертипов TypeMirror:

TypeMirror serializable = elementUtil.getTypeElement("java.io.Serializable").asType();
boolean isSerializable = typeUtil.isAssignable(tm, serializable);