您当前位置:网站首页 >> 知识专区
注解是什么?
文章来源:CSDN 老 匡  上传时间:2022-12-30  浏览量:602

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

一、注解是什么

注解(Annotation)是JDK1.5引入的注释机制,它本身没有任何意义,仅仅是对代码的注释,被修饰的代码不会被影响执行。

但是它和普通的代码注释又不同,可以保留在各个时间段(源码、字节码、运行时),在各个时间段通过不同的技术(APT、字节码增强、反射),做不同的事情。

举一个简单的例子:

@Override:检查该方法是否是重写方法,仅保留在源码阶段,编译时判断如果父类和接口中没有该方法,会报错。

二、自定义注解

咱们依然拿@Override注解举例,下面是它的源码

@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { } 
			

			

从上面代码我们看到了三个比较新的东西,@Target、@Retention、@interface,咱们一个个来说

2.1 关键字:@interface

类使用class关键字修饰、接口使用interface关键字修饰、注解使用 @interface 关键字修饰。

2.2 元注解:@Target

注解是用来注释代码的,而元注解是用来注释注解的,给自定义的注解增加一些限定范围。

@Target:元注解之一,限制注解的使用范围,比如作用在属性、方法还是类上。接收的是一个数组,可以指定多个范围。

可接收的范围:

public enum ElementType { // 类、接口(包括注释类型)或枚举 TYPE, // 字段(包括枚举常量) FIELD, // 方法 METHOD, // 参数 PARAMETER, // 构造方法 CONSTRUCTOR, // 局部变量 LOCAL_VARIABLE, // 注释类型 ANNOTATION_TYPE, // 包 PACKAGE } 
			

			

举例:

// 单个范围,@Override仅可用在方法上 @Target(ElementType.METHOD) public @interface Override { } // 多个范围,@Test可使用在 构造方法 和 方法 上 @Target({ElementType.CONSTRUCTOR, ElementType.METHOD}) public @interface Test { } 
			

			

2.3 元注解:@Retention

@Retention:元注解之一,保留级别,设置该注解代码可以保留到什么阶段。

可保留的阶段:

public enum RetentionPolicy { // 源码阶段,在编译阶段存留,在class字节码中会消除 SOURCE, // 字节码阶段,在class字节码存留,在运行时消除 CLASS, // 运行时阶段,最长的阶段,可以保留到虚拟机中 RUNTIME } 
			

			

举例:

// @Override注解只能保存到源码阶段,在生成class字节码中消除 @Retention(RetentionPolicy.SOURCE) public @interface Override { } 
			

			

2.4 自定义注解:@Test

我们来实战一下,需求如下:

  1. 可以保留到字节码阶段
  2. 能作用在 字段 和 方法 上
  3. 可以接收字符串数组参数

答案:

// 注解定义 @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.CLASS) public @interface Test { String[] value(); } 
// 使用 public class TestAnnotation { @Test("test") private String name; @Test({"test1", "test2"}) public void test() { } } 
			

			

三、注解的作用

文章的开头我们提到过,注解保留在各个时间段(源码、字节码、运行时),在各个时间段通过不同的技术(APT、字节码增强、反射),做不同的事情。

我们这里不对技术进行详解,只对其做个概述,大家知道能做什么即可,如果有兴趣可以去深入学习。

3.1 源码阶段 —— APT(注解处理器)

APT(Annotation Processing Tool),注解处理器,简单来说就是在编译时寻找被该注解注释的代码,获取注解上的信息,通过某种方式进行提醒或者生成Java代码(不能修改原代码,如:JavaPoet)。比如路由注解就是通过编译时生成代码统一注册的。

ButterKnife、EventBus、ARouter等框架用的都是该技术,但是大家更喜欢把保留级别指定在字节码和运行时,因为一定会包括源码阶段。

3.2 字节码阶段 —— 字节码增强

就是修改字节码,在生成的class字节码阶段,可以对当前被注释的方法进行修改增强。比如我们写一个@NeedLogin注释在一个需要登录的方法外面,在生成字节码后可以对该方法的前后进行字节码插入,以达到登录的目的。

// 初始代码 @NeedLogin public void test() { System.out.println("你好"); } // 被字节码增强后 public void test() { if (!isLogin) { // 打开登录页 return; } System.out.println("你好"); } 
			

			

3.3 运行时阶段 —— 反射

在运行时可以通过反射获取注解的信息和元素,根据这些可以做不同的逻辑判定。

总结

最后咱们再总结一下注解的知识点:

  1. 注解是JDK1.5引入的注释机制,本身没有任何意义。
  2. 注解使用@interface关键字修饰,使用@Target指定限定范围(方法、属性等),使用@Retention指定保留阶段(源码、字节码、运行时)。
  3. 注解可以在源码阶段使用APT,在字节码阶段使用字节码增强,在运行时阶段使用反射。


27

2021-08

HTML5 标签大全笔记,用到的时候翻一下,百度都省了!

HTML5 标签大全笔记,用到的时候翻一下,百度都省了!

29

2021-06

python自制一款职位分析器,一键生成岗位分析报告

python自制一款职位分析器,一键生成岗位分析报告

26

2021-04

Python基础语法和数据类型最全总结

总结了Python最全基础语法和数据类型总结,一文带你学会Python。

07

2022-02

TCP协议详解

TCP协议详解

13

2021-08

七夕节快到了,教你用MATLAB绘制blingbling的大钻石

七夕节快到了,教你用MATLAB绘制blingbling的大钻石

15

2021-07

立刻安装Windows11预览版抢先体验(虚拟机 | 含详细安装步骤)

立刻安装Windows11预览版抢先体验(虚拟机 | 含详细安装步骤)

15

2021-01

放弃 PHP,选择 Node.JS 的 8 个理由!

谈到 PHP 逐渐被看衰这个现象,我想起前两天看到一篇浏览器领域龙头老大的争夺战的有趣报道,报道里大致讲了几个浏览器奋发图强夺得宝座之后又不思进取,然后逐渐被超越的演化史。更往远看一些,中国历史上著名的卧薪尝胆的前后也大致相似。PHP 是否也会如此?后浪是不是能够取代他的地位?众口纷纭……

21

2021-04

3D 语义分割、目标检测、实例分割。TF 3D 技术让你一目了然

3D 语义分割、目标检测、实例分割是什么神仙操作?TF 3D 技术让你一目了然
返回顶部
客服电话
用微信扫一扫关注我们
请各公司推销人员注意:我单位拒绝任何方式、任何形式的电话推销,请勿拔打我单位客服热线进行电话推销,谢谢合作!
公司名称:100元4个小时上门服务电话
100元4个小时上门服务电话-同城约茶服务十点击查看网站【www.sscmtv.com】200元3小时上门不限次二维码-微信qq上600块3小时不限次数-一百【点击进入立即约茶】。小妹
关键词:知识专区:注解是什么?,100元4个小时上门服务电话【点击进入网站查看约茶服务】。网上怎么找上门服务,附近品茶服务,喝茶服务联系方式,附近初中生300块电话号码,不限次品茶,一条龙的服务上门二维码,100块钱上门服务电话号码,200元1小时做完付款十同城附近约茶服务:【进入平台查看预约服务】。同城包小妹电话是,小姐服务,本地同城附近200元,24小时上门二维码,1243567800元3小时上门服务电话,500块钱3小时上门服务电话,,联系同城约茶服务,【点击这里进入上门服务】。 附近大泡50元的电话
云南网站建设,云南网页设计,昆明网站建设,昆明网页设计  网站管理
【版权声明】本站部分内容由互联网用户自行发布,著作权或版权归原作者所有。如果侵犯到您的权益请发邮件致info@ynjwz.com,我们会第一时间进行删除并表示歉意。