在注释处理器上编译时检查 class 层次结构
Check class hierarchy at compile on an annotation processor
我正在编写注释处理器以在编译时执行以下检查:
- 有接口
E
- 有一个注释
@Apply
用于注释方法。
- 用
@Apply
注释的方法应该被称为 apply
并且只接受 class 实现 E
的一个参数
到目前为止,我已经确定了所有名为 apply
的注释方法,并提取了它们作为参数的 class 的名称。所以我只剩下:
Element method // this is the Element that represents the `apply` method
TypeMirror mirror //method's TypeMirror
String paramClass // the parameter's class Name.
问题是:我如何(如果有的话)摆脱这些参数的 class 层次结构表示,以便我可以检查它实现 E
。
无法使用 ClassLoader.loadClass
,因为 class 尚不存在,但我只需要 class 层次结构。
碰巧有一个使用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
表示的方法的参数 class 是否是所需类型 E
的子类型
我正在编写注释处理器以在编译时执行以下检查:
- 有接口
E
- 有一个注释
@Apply
用于注释方法。 - 用
@Apply
注释的方法应该被称为apply
并且只接受 class 实现E
的一个参数
到目前为止,我已经确定了所有名为 apply
的注释方法,并提取了它们作为参数的 class 的名称。所以我只剩下:
Element method // this is the Element that represents the `apply` method
TypeMirror mirror //method's TypeMirror
String paramClass // the parameter's class Name.
问题是:我如何(如果有的话)摆脱这些参数的 class 层次结构表示,以便我可以检查它实现 E
。
无法使用 ClassLoader.loadClass
,因为 class 尚不存在,但我只需要 class 层次结构。
碰巧有一个使用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
表示的方法的参数 class 是否是所需类型 E