Процессор аннотаций 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);