首页 > 其他分享 >注解是如何实现的?

注解是如何实现的?

时间:2024-08-27 21:07:35浏览次数:10  
标签:反射 如何 实现 接口 Annotation 继承 注解 method

注解是否支持继承

不支持继承

不能使用关键字extends来继承某个@interface,但注解在编译后,编译器会自动继承java.lang.annotation.Annotation接口.

虽然反编译后发现注解继承了Annotation接口,但即使Java的接口可以实现多继承,但定义注解时依然无法使用extends关键字继承@interface。

区别于注解的继承,被注解的子类继承父类注解可以用@Inherited: 如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。

注解实现的原理

//元注解
public @interface 注解名称{
}

自定义的注解反编译后的内容

public interface MyAnno extends java.lang.Innotation.Annotation {
}

也就是说,注解的本质其实就是一个接口,并且继承了java.lang.annotation.Annotation接口.

因此,注解里的属性都是常量,方法都是抽象方法。但是自定义注解不能使用void返回类型。而注解里的方法一般都叫 “属性”,因为用法一般都是:方法 = xxx

返回值类型有下列取值:

  • 基本数据类型

  • String

  • 枚举

  • 注解

  • 以上类型的数组

运行时注解解析

定义了注解后,就可以在代码中使用了,但这还没完,还需要对注解进行解析和处理。在运行时需要用到反射来解析注解,反射API中有专门用于处理注解的API:

  • AnnotatedElement :这是反射接口处理注解的核心类型,它是反射类型Method,Field和Constructor的基类,通过它的方法来获取注解Annotation实例。
  • 用Annotation来处理具体的注解

注意,注解的解析和处理用的是反射,所以注解定义时要用RententionPolicy.RUNTIME,否则用反射是拿不到注解信息的,因为反射是在运行时(Runtime)。

解析注解实例:

public class MethodInfoParsing {
    public static void main(String[] args) {
        try {
            Method[] methods = MethodInfoParsing.class
                    .getClassLoader().loadClass("MethodInfoExample").getDeclaredMethods();
            for (Method method : methods) {
                if (!method.isAnnotationPresent(MethodInfo.class)) {
                    continue;
                }
                for (Annotation annotation : method.getDeclaredAnnotations()) {
                    System.out.println("Annotation " + annotation + " on method " + method.getName());
                }
                MethodInfo info = method.getAnnotation(MethodInfo.class);
                if ("Paul".equals(info.author())) {
                    System.out.println("From Pauls: " + method.getName());
                }
            }
        } catch (ClassNotFoundException e) {
        }
    }
}

关于作者

来自一线程序员Seven的探索与实践,持续学习迭代中~

本文已收录于我的个人博客:https://www.seven97.top

公众号:seven97,欢迎关注~

标签:反射,如何,实现,接口,Annotation,继承,注解,method
From: https://www.cnblogs.com/seven97-top/p/18383512

相关文章

  • 网络地址转换(NAT)技术实现细节
    网络地址转换(NAT)是一种在IPv4网络中实现地址转换的技术,它允许一个局域网(LAN)使用一个公共IP地址与Internet通信。NAT技术的实现细节包括以下几个方面:静态NAT:静态NAT将内部私有IP地址与外部公共IP地址进行一对一的映射。这种映射关系在NAT设备上预先配置,并且是永久的。静态N......
  • 生动形象的解释计算机网络中隧道技术实现原理
    隧道技术是计算机网络中一种用于在不同网络之间传输数据的方法。隧道技术的实现原理可以类比于在现实生活中的地铁隧道系统。让我们通过一个生活中的例子来生动形象地解释隧道技术的实现原理。假设你现在在城市A,想要去很远的城市B。城市A和城市B之间有一座大山,无法直接穿越......
  • 如何使用hardware breakpoint
    要使用内核的硬件断点(hardwarebreakpoint)来定位内核模块中的内存访问问题,你可以通过以下步骤进行设置和调试。1.确定要监控的内存地址首先,你需要确定你想要监控的内存地址。这可以是某个变量的地址或者某个内存区域的开始地址。内核模块的内存访问问题通常涉及访问越界、未初......
  • 如何使用 Bittly 实现 UDP 请求自动响应与处理
    在开发基于UDP的应用时,如果通信目标未就绪或者临时不可用时,可以使用Bittly的模拟服务虚拟一个支持UDP通讯的通讯终端。本文将介绍如何使用Bittly工具,实现对UDP请求的自动响应、动态数据处理、数据分帧以及数据转发。我们将从服务的准备工作开始,逐步讲解每一个步骤,帮......
  • 注解的优点?元注解?
    介绍注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。主要作用如下:编写文档——通过注解中标识的元数据可以生成doc文档,这是最常见的,也是java最早提供的注解。常用的有@param@return等代码分析——通过......
  • 【Azure Developer】如何在Azure门户上把当前账号下的所有资源信息列举并导出呢?
    问题描述是否可以在Azure上,一次性把当前账号所有能查看的资源都导出来呢?包含资源名称,类型,定价层SKU信息呢? 问题解答是的,通过AzureResourceGraphExplorer服务可以实现。AzureResourceGraphExplorer是一个强大的工具,旨在提供跨订阅的资源查询和治理。它允许用户在任何......
  • 分析 HashSet 和 TreeSet 分别如何实现去重的
     分析HashSet和TreeSet分别如何实现去重的: (1)HashSet的去重机制:hashCode()+equals()。底层先通过存入对象,进行运算得到一个hash值,通过hash值得到对应的索引,如果发现table索引所在的位置,没有数据,就直接存放;如果有数据,就进行equals遍历比较,比较后不相同,就加入,否......
  • 生产者消费者模式,以及基于BlockingQueue的快速实现
    生产者消费者模式,以及基于BlockingQueue的快速实现什么是生产者消费者模式,简单来说就是有两个角色,一个角色主要负责生产数据,一个角色主要负责消费(使用)数据。那么生产者直接依赖消费者,然后直接调用是否可以?答案是可以的,但是有些场景无法及时解决,典型的就是生产者消费者的速度无法同......
  • 小米路由器刷入Breed与OpenWrt详细流程并实现远程管理本地软路由
    文章目录前言1.安装Python和需要的库2.使用OpenWRTInvasion破解路由器3.备份当前分区并刷入新的Breed4.安装cpolar内网穿透4.1注册账号4.2下载cpolar客户端4.3登录cpolarwebui管理界面4.4创建公网地址5.固定公网地址访问前言今天分享一下如何在小米路......
  • C语言字符函数和字符串函数的详解及模拟实现(超详细)
    目录1.求字符串长度1.1strlen1.1.1.strlen函数介绍1.1.2.strlen函数模拟实现 2.长度不受限制的字符串函数 2.1strcpy2.1.1.strcpy函数介绍2.1.2.strcpy函数模拟实现 2.2strcat2.2.1.strcat函数介绍2.2.2.strcat函数模拟实现 2.3strcmp 2.3.1.strcmp函数介绍......