如何在注解处理中获得泛型类型的合格类名?

赛义昌三

我有一个像这样的界面:

interface MyInterface<V>{

}

例如,我所有带注释的类都以@MyAnnotation不同方式实现此接口。

//first way
Class1 implement MyInterface<SomeClass>
//second way
AbstractClass<V> implement MyInterface<V>
Class2 extends  AbstractClass<SomeClass>
//third way    
ConcreteClass implement MyInterface<SomeClass>
Class3 extends ConcreteClass

好吧,我TypeElement的类为1,2和3,我想找到类型为variable的限定名称V

我尝试了此方法,但它返回V而不是SomeClass

TypeElement class1 = ...
while(reachToMyInterface){
for (TypeMirror m : ((DeclaredType) class1.asType()).getTypeArguments()) {
      print(m.toString()) // prints V
  }
  class1 = getItsSuperClass();
}

编辑:同样这种方法也有同样的问题:

 for (Element element : roundEnv.getElementsAnnotatedWith(Haha.class)) {
            if (element instanceof TypeElement) {
                TypeElement te = (TypeElement) element;
                TypeElement currentType = te;
                while(currentType!=null){
                for (TypeMirror typeMirror : currentType .getInterfaces()) {
                  if (typeMirror instanceof DeclaredType) {
                       DeclaredType dclt = (DeclaredType) typeMirror;
                      for (TypeMirror argument : dclt.getTypeArguments()) {
                        print(argument);
                      }
                   }
                }
                currentType = getSuperClass(currentType);                   
              }
}
private TypeElement getSuperClass(TypeElement typeElement) {
        if (!(typeElement.getSuperclass() instanceof DeclaredType)) return null;
        DeclaredType declaredAncestor = (DeclaredType) typeElement.getSuperclass();

        return (TypeElement) declaredAncestor.asElement();
    }
肖恩·帕特里克·弗洛伊德(Sean Patrick Floyd)

这很痛苦,但是可以做到。

使用以下类型:

@Retention(RUNTIME) @Target(TYPE) public @interface Haha {}

interface MyInterface<V>{}

@Haha public class StringImpl implements MyInterface<String> {}

这里有一个注释处理器上打印“java.lang.String中”的@Haha注解上StringImpl

public class Proc extends AbstractProcessor {
    @Override public Set<String> getSupportedAnnotationTypes() {
        return Collections.singleton("bar.Haha");
    }

    @Override public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.RELEASE_8;
    }

    @Override public boolean process(final Set<? extends TypeElement> annotations,
                                     final RoundEnvironment roundEnv) {
        for (Element element : roundEnv.getElementsAnnotatedWith(Haha.class)) {
            if (element instanceof TypeElement) {
                TypeElement te = (TypeElement) element;
                for (TypeMirror typeMirror : te.getInterfaces()) {
                    if (typeMirror instanceof DeclaredType) {
                        DeclaredType dclt = (DeclaredType) typeMirror;
                        for (TypeMirror argument : dclt.getTypeArguments()) {
                            System.out.println(argument);
                        }
                    }
                }
            }
        }
        return false;
    }
}

到达那里需要进行大量测试和摆弄,我使用了该测试来调试过程:

public class ProcTest {
    @Test
    public void run() {
        String basePath = "/path/to/src/folder/";
        List<String> args = asList("Haha", "MyInterface", "StringImpl")
                .stream()
                .map(s -> basePath +"bar/" + s + ".java")
                .collect(Collectors.toList());
        args.addAll(0, asList("-processor", Proc.class.getName()));
        String[] flags = args.toArray(new String[3]);
        ToolProvider.getSystemJavaCompiler()
                    .run(System.in, System.out, System.err,  flags);
    }
}

如果在调试模式下运行此命令,则可以在注释处理器内部设置断点。这确实帮助我更好地了解了事情。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在泛型类中处理可为空的类型

来自分类Dev

您如何在Eclipse中获得完全合格的类名?

来自分类Dev

如何在泛型类中返回对象的泛型类型?

来自分类Dev

如何在泛型方法中获取泛型类型的类实例

来自分类Dev

如何在泛型类中返回“ this”?

来自分类Dev

如何在类中使用扩展的泛型类型的类型?

来自分类Dev

泛型:如何处理类层次结构中的多个有界类型

来自分类Dev

如何在Scala中为泛型类型提供默认类型类?

来自分类Dev

如何在Kotlin PSI中获得类的完全合格域名?

来自分类Dev

如何在我子类化的类中的Swift中返回泛型类型

来自分类Dev

如何在处理来自API响应的可选包含的打字稿中制作泛型类型?

来自分类Dev

java泛型如何确保类型有指定的注解?

来自分类Dev

如何在没有反射的情况下确定Java中泛型属性的类类型?

来自分类Dev

如何在C#中收集具有泛型类型的静态类的所有“实例”?

来自分类Dev

Spring RestTemplate:如何在泛型类中定义参数类型

来自分类Dev

如何在具有泛型类型的类中启用协方差?

来自分类Dev

如何使用泛型返回泛型类的类类型?

来自分类Dev

如何在非泛型静态类的多个方法中使用相同的泛型类型

来自分类Dev

如何在显示的javadoc代码块中获得泛型?

来自分类Dev

如何从Java中的泛型类型推断类?

来自分类Dev

如何获得嵌套的泛型类型

来自分类Dev

如何获得继承的泛型类型

来自分类Dev

如何获得 T 泛型的类型?

来自分类Dev

如何在C#中的泛型类中使用泛型类的对象?

来自分类Dev

如何为泛型类指定泛型集合类型?

来自分类Dev

类中的getConstructors()中的泛型类型

来自分类Dev

泛型方法和泛型类中的类型推断

来自分类Dev

Java泛型中<?>类型的处理

来自分类Dev

如何在Ada中明确显示泛型类型的大小?

Related 相关文章

  1. 1

    如何在泛型类中处理可为空的类型

  2. 2

    您如何在Eclipse中获得完全合格的类名?

  3. 3

    如何在泛型类中返回对象的泛型类型?

  4. 4

    如何在泛型方法中获取泛型类型的类实例

  5. 5

    如何在泛型类中返回“ this”?

  6. 6

    如何在类中使用扩展的泛型类型的类型?

  7. 7

    泛型:如何处理类层次结构中的多个有界类型

  8. 8

    如何在Scala中为泛型类型提供默认类型类?

  9. 9

    如何在Kotlin PSI中获得类的完全合格域名?

  10. 10

    如何在我子类化的类中的Swift中返回泛型类型

  11. 11

    如何在处理来自API响应的可选包含的打字稿中制作泛型类型?

  12. 12

    java泛型如何确保类型有指定的注解?

  13. 13

    如何在没有反射的情况下确定Java中泛型属性的类类型?

  14. 14

    如何在C#中收集具有泛型类型的静态类的所有“实例”?

  15. 15

    Spring RestTemplate:如何在泛型类中定义参数类型

  16. 16

    如何在具有泛型类型的类中启用协方差?

  17. 17

    如何使用泛型返回泛型类的类类型?

  18. 18

    如何在非泛型静态类的多个方法中使用相同的泛型类型

  19. 19

    如何在显示的javadoc代码块中获得泛型?

  20. 20

    如何从Java中的泛型类型推断类?

  21. 21

    如何获得嵌套的泛型类型

  22. 22

    如何获得继承的泛型类型

  23. 23

    如何获得 T 泛型的类型?

  24. 24

    如何在C#中的泛型类中使用泛型类的对象?

  25. 25

    如何为泛型类指定泛型集合类型?

  26. 26

    类中的getConstructors()中的泛型类型

  27. 27

    泛型方法和泛型类中的类型推断

  28. 28

    Java泛型中<?>类型的处理

  29. 29

    如何在Ada中明确显示泛型类型的大小?

热门标签

归档