在注释处理器上编译时检查类层次结构

时间:2015-04-30 15:42:42

标签: java annotations jvm annotation-processing

我正在编写一个注释处理器,以便在编译时执行以下检查:

  • 有一个界面E
  • 有一个注释@Apply,用于注释方法。
  • 使用@Apply注释的方法应该被称为apply,并且只接受实现E的类的一个参数

我已经知道所有带注释的方法apply,并提取它们作为参数的类的名称。所以我离开了:

 Element method  // this is the Element that represents the `apply` method
 TypeMirror mirror //method's TypeMirror
 String paramClass // the parameter's class Name.

问题是:如果可以,我可以从这些参数的类层次结构表示中获取,所以我可以检查它是否实现了E。 不能使用ClassLoader.loadClass,因为该类已经不存在,但我只需要类层次结构。

1 个答案:

答案 0 :(得分:0)

使用javax.lang.model.util.Types.isSubtype()方法有一种简单的方法:

 TypeMirror parameterTypes = mirror.getParameterTypes();
 TypeMirror typeOfE = processingEnv.getElementUtils().getTypeElement(E.class.getName()).asType();
 boolean isSubTypeOfE = processingEnv.getTypeUtils().isSubtype(parameterType, eventType)

我可以检查mirror所代表的方法的参数类是否是所需类型的子类型E