2015-12-01 3 views
2

У меня есть аннотация, которая отмечает классы, которые содержат внутренний класс, который реализует именованный интерфейс.Java - Обработка аннотации

Вот пример того, как используется эта аннотация:

public interface Implementable {} 

@Deserializable(Implementable.class) 
public class ImplementableFactory { 
    public static Implementable getImplementable() { 
     return new Impl(); 
    } 
    private class Impl implements Implementable {} 
} 

А вот сама аннотация:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@SupportedSourceVersion(SourceVersion.RELEASE_8) 
public @interface Deserializable { 
    Class value(); 
} 

Я хотел бы сделать некоторые обработки аннотаций, чтобы обеспечить этот контракт. Я создал класс процессора аннотаций для этой цели:

public class DeserializableProcessor extends AbstractProcessor { 

    @Override 
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { 
     for(Element element : roundEnv.getElementsAnnotatedWith(Deserializable.class)){ 
      TypeMirror expected = getDeserializableValue(element); 
      if (expected != null) { 
       Boolean found = false; 
       for (Element enclosed : element.getEnclosedElements()) { 
        if (enclosed.getKind().equals(ElementKind.CLASS)) { 
         //This next bit doesn't compile. 
         //I'm looking for the same functionality. 
         if (expected.isAssignableFrom(enclosed)) { 
          found = true; 
          break; 
         } 
        } 
       } 
       if (!found) { 
        String message = String.format("Classes marked with the Deserializable annotation must contain an inner class with implements the value of the annotation. %s does not contain a class which implements %s.", 
          element.getSimpleName().toString(), 
          expected.toString()); 
        processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, message); 
       } 
      } 
     } 
     return true; 
    } 

    private TypeMirror getDeserializableValue(Element element) { 
     ... 
    } 
} 

Как я могу добиться аналогичной функциональности для Class :: IsAssignableFrom в отражении возможного через обработку аннотаций?

ответ

1

Это можно сделать с помощью защищенной обработки AbstractProcessorEnvironment. Он предоставляет реализацию TypeUtils, класс утилит, который обеспечивает много функциональности отражения.

if (processingEnv.getTypeUtils().isAssignable(enclosed.asType(), expected)) { 
    found = true; 
    break; 
} 
Смежные вопросы