我正在研究 Java (javax) 注释处理。
假设我有一个方法注释:
@Target(ElementType.METHOD)
public @interface MethodAnnotation { }
现在我想处理从带注释的方法的类型重写的所有方法:
interface MyInterface() {
@MethodAnnotation
void f()
}
class MyClass implements MyInterface {
override void f() { } // <- I want to process this method
}
@Inherited
元注释似乎不适合这里:
请注意,如果带注释的类型用于注释类以外的任何内容,则此元注释类型无效。
另外,是否可以处理未在子类中重写的继承类方法?像这样:
class MyClass {
@MethodAnnotation
void f() { }
}
class MySubClass extends MyClass { } // <- I want to process its f()
// or at least to find out that it doesn't
// override the method
如何访问某个方法的重写方法AbstractProcessor
?
我想,为了实现这一点,我需要找到封闭类的子类,但我也没有找到一种方法来做到这一点。
UPD: 我想可以使用RoundEnvironment.getRootElements()
但仍然没有找到正确的方法来做到这一点。
简而言之,开箱即用的注释处理不会让这对您来说变得容易,但它can做完了。
您实际上必须处理,而不是使用正常的调度机制进行处理every方法并自己进行过滤。
Step 1:
定义您的处理器,以便它支持所有注释 https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html#getSupportedAnnotationTypes--通过使用"*"
作为其支持的注释类型。这意味着您的处理器将在每一轮中被调用。
Step 2:
Use getRootElements https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/RoundEnvironment.html#getRootElements--每轮获取整组元素。
Step 3:
创建一个ElementScanner8 https://docs.oracle.com/javase/8/docs/api/javax/lang/model/util/ElementScanner8.html遍历您要查找的任何元素ExecutableElement
s。如果您愿意相信重写的方法带有注释@Override
,您可以对这些进行快速过滤。否则,只需查看所有这些即可。
Step 4:
现在您需要查看该方法是否覆盖了带有您正在查找的注释的方法。没有简单的方法来获取给定方法已覆盖的方法,因此您需要获取包围元素 https://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/Element.html#getEnclosingElement--的方法,看看它的超类 https://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/TypeElement.html#getSuperclass-- and 实现的接口 https://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/TypeElement.html#getInterfaces--(递归地),得到他们的封闭的元素 https://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/TypeElement.html#getEnclosedElements--, 过滤掉方法 https://docs.oracle.com/javase/7/docs/api/javax/lang/model/util/ElementFilter.html#methodsIn(java.lang.Iterable), and 测试它是否已被覆盖 https://docs.oracle.com/javase/8/docs/api/javax/lang/model/util/Elements.html#overrides-javax.lang.model.element.ExecutableElement-javax.lang.model.element.ExecutableElement-javax.lang.model.element.TypeElement-通过有问题的方法。如果有,您可以检查注释 https://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/Element.html#getAnnotationMirrors--看看其中是否有您关心的人。
Step 5:
此时,您应该拥有您正在寻找的重写方法、被重写方法和注释镜像,因此您应该能够实现您想要的任何逻辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)