【问题标题】:Java Annotations - How can you check if an annotated element implements an interface?Java Annotations - 如何检查带注释的元素是否实现了接口?
【发布时间】:2015-10-01 23:24:09
【问题描述】:

假设我有一个类,并且在这个类中,我有一个实现 MyInterface 的对象的实例,它由@MyAnnotation 注释

在我的注释编译器中,我得到了一个由@MyAnnotation 注释的元素列表

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(MyAnnotation.class);

    for (Element element : elements) {
        // How can I check if the class that `element` represents, implements my interface?
    }
    ...
}

我知道我可以有一个实现该接口的类的列表,然后检查该元素所代表的类是否是这些类之一,但显然这种解决方案并不理想

有谁知道这是否可行?

【问题讨论】:

    标签: java android annotations


    【解决方案1】:

    找到答案:

    public static boolean isInstanceOf(Types types, Elements elements, String class1, String class2) {
        Element element1 = elements.getTypeElement(class1);
        Element element2 = elements.getTypeElement(class2);
    
        if (element1 == null || element2 == null) {
            return false;
        }
    
        return types.isAssignable(element1.asType(), element2.asType());
    }
    

    【讨论】:

      【解决方案2】:

      任何定义为接口实现的类都可以使用instanceof 进行检查。

      if (element instanceof MyInterface) {
          // your code here!
      }
      

      【讨论】:

      • 这不是一个普通的对象。 Element 对象不是实际的实例,它是一个存储有关实例的一些信息的数据模型。因此它不会是接口的实例
      猜你喜欢
      • 2018-10-19
      • 1970-01-01
      • 2010-09-21
      • 2016-09-29
      • 2012-12-29
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      相关资源
      最近更新 更多