如何在注释处理中引用方法的实现?

2024-01-15

我正在研究 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遍历您要查找的任何元素ExecutableElements。如果您愿意相信重写的方法带有注释@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(使用前将#替换为@)

如何在注释处理中引用方法的实现? 的相关文章

随机推荐

  • Android 虚拟设备 - Armeabi-v7a 与 x86_64

    我想制作自己的 Android 应用程序 我正在使用 Ubuntu 64 位和 IntelliJ 在虚拟设备配置中 它要求我选择系统映像 所有选项都有一个Download另外 这意味着我还没有下载任何系统映像 有 3 个选项可供选择Loll
  • grep 排除多个字符串

    我正在尝试使用查看日志文件tail f并想要排除包含以下字符串的所有行 Nopaging the limit is and keyword to remove is 我可以像这样排除一个字符串 tail f admin log grep v
  • 如何在 Cloud Machine Learning Engine 上获取模型的 C# 在线预测?

    我已成功部署在 Cloud ML Engine 上的模型上 并验证它正在使用gcloud ml engine models predict依照指示说明 https cloud google com ml engine docs how to
  • 在bash中将字符插入字符串?

    我需要转动绳子 125959 into 12 59 59 显然 字符串是时间 所以正则表达式在这里不太好 time 125959 echo time 0 2 time 2 2 time 4 2
  • 并发程序中的 I/O

    我正在开发一个并发程序 它有两个线程 其中一个监听来自服务器的消息 另一个线程向服务器发送消息 我需要从用户获取命令 使用 cin 并同时显示来自服务器的消息 我该如何处理这种情况 问题是 如果我在收到消息时读取用户的命令 则用户的输入会被
  • Mesa + Linux:gl.h 不包含现代 OpenGL

    这是我目前使用的环境 Eclipse Luna Linux Mint Rebecca 上的 C 11 当我尝试使用现代 OpenGL 例如 VAO 或 VBO 时 我收到编译器错误 导致方法无法解析 例如 GLuint VaoID GLui
  • F# 中 Control.Observable 和 Control.Event 模块之间有哪些相似/差异?

    F 至少在 Visual Studio 2012 中 两者兼而有之Control Observable http msdn microsoft com en us library ee370313 v vs 110 aspx and Con
  • 带有scope.$watch的Angular指令强制验证其他字段

    我写了一个match model当用户在我的应用程序中注册时 我用于密码 密码重复过程的角度指令 密码重复字段具有此特定属性 可根据原始密码字段验证此字段 我的指令有scope watch出于优化目的 因为我不必每次验证重复密码范围属性时都
  • 枚举和使用带有常量的静态类有什么区别?

    这两项之间的性能影响是什么 我最近在野外看到了静态类 但我不知道如何理解它 public enum SomeEnum One 1 Two Three public static class SomeClass public static r
  • OpenGL 二进制程序格式是否标准化?

    我一直在谷歌上搜索 OpenGL 二进制格式及其实际含义 到目前为止我还没有取得太大的成功 我知道我可以按如下方式获取数量和格式集 glGetIntegerv GL PROGRAM BINARY FORMATS values 0 其中 va
  • NX Monorepo 和库中的情感主题

    我们想用useTheme from emotion react在库内和我们的应用程序内 我们正在使用 反应本机网络 nx monorepo 反应本机 这是我们的结构 apps web ReactJS mobile React native
  • 如何使用 Gallio 和 MBUnit 以编程方式运行单元测试?

    作为部署过程的一部分 我正在尝试以编程方式检查我的单元测试是否通过 该应用程序使用 MBunit 和 Gallio 作为其单元测试框架 这是我的代码 var setup new Gallio Runtime RuntimeSetup set
  • ASP.NET MVC 操作被调用两次

    我有一个特定的控制器操作被调用两次 这除了奇怪之外还导致我的应用程序的单例部分出现问题 这并不是真正的问题 它只是引起了我对两次调用的注意 知道为什么控制器操作每次都会执行两次吗 不回来false或者阻止对通过 AJAX 进行调用的链接上的
  • 如何将 QFlags 与 QML 结合使用?

    我有一个我创建的 QFlag 我想在 QML 中使用这个 QFlag 具体来说 我希望能够将几个标志组合在一起 并将它们作为参数传递给方法 我注意到这里没有明确列出 QFlags 作为 QML 支持的数据类型 http doc qt nok
  • iOS .onContinueUserActivity 未被调用

    onContinueUserActivity从未被调用过Apple 提供的状态恢复示例应用程序 https developer apple com documentation swiftui restoring your app s sta
  • 哪些语言向开发人员公开 IEEE 754 陷阱?

    我想出于教育目的玩这些陷阱 数值微积分中默认行为的一个常见问题是我们 错过 了错误运算中出现的 Nan 或 inf 默认行为是通过计算进行传播 但某些操作 如比较 会破坏链条并释放 Nan 并且其余处理将继续 而不会在算法的先前步骤中确认奇
  • Mysql存储函数和分组最小值[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Schema 数据库架构得到简化 活动表该表存储事件 CREATE TABLE Events event id bigint 20 u
  • MethodImpl(AggressiveInlined) - 它有多激进?

    所以我稍微看了一下MethodImpl 属性 http msdn microsoft com en us library system runtime compilerservices methodimplattribute v vs 11
  • iOS 中 Unity Json.net System.Reflection.Emit 错误

    我按照说明将 link xml 包含在 asset 文件夹中 但仍然收到错误 我认为这可能与反序列化字典有关 因为错误紧随其后 System Collection Generic IDictionary 2 set Item TKey TV
  • 如何在注释处理中引用方法的实现?

    我正在研究 Java javax 注释处理 假设我有一个方法注释 Target ElementType METHOD public interface MethodAnnotation 现在我想处理从带注释的方法的类型重写的所有方法 int