初识Java注解(分享笔记)

背景:在对注解一无所知的前提下,看了一些书籍、博客等资料,作为对注解的一次总结和分享。有很多概念都是基于自己理解写下来的,不是很负责任。有什么理解错误的或者不对的地方,欢迎各位大佬指正,非常感谢感谢

1、什么是注解?

官方解释:注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后某个时刻非常方便地使用这些数据。

自己理解:可以把注解理解为便利贴,它可以写入一定信息,哪里要用贴哪里,so easy!

注解在一定程度上是在把元数据与源代码文件结合在一起,而不是保存在外部文件文档中这一大趋势之下所催生的(由来)
注解的引入是JDK1.5的一个重要变化

以将由编译器来测试和验证的格式来存储有关程序的额外信息

提出疑问:什么是元数据?
元数据被定义为:描述数据的数据,对数据及信息资源的描述性信息(来自百度百科)
绕回来,那在产生注解的这一背景下,其元数据是啥意思???(懵)
好像是:用来完整地描述程序所需的信息

Java SE5内置了三种注解,定义在java.lang中:
(1)@Override:表示当前的方法定义将覆盖超类中的方法。
有什么好处呢?如果你一不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。
(2) @Deprecated:如果程序员使用了注解为它的元素,那么编译器就会发出警告信息。
比如???
(3) @SuppressWarnings:关闭不当的编译器警告信息。

2、基本语法

注解可以同其他修饰符共同作用于方法,如public、static或void。从语法的角度来看,注解的使用方式几乎与修饰符的使用一模一样。

2.1 定义注解

初识Java注解(分享笔记)_第1张图片

可以看到,注解的定义很像接口的定义。事实上,这个注解与接口一样,注解也将会被编译成class文件。
@Retention(RetentionPolicy.RUNTIME)代表BankTransferMoney这个注解将在运行时被保留。所以会被保留到字节码文件。

@Retention就属于下面要说到的元注解,用于注解我们自定义的注解(如:@BankTransferMoney)

自定义注解的组成图解:
初识Java注解(分享笔记)_第2张图片

元注解在2.2会说到
注解元素在3.1会说到

2.2 元注解

首先,什么是元注解?
元注解:注解的注解。元注解专职负责注解其他的注解,主要用于一些自定义注解。
元注解包含一下4个:

(1)@Target:定义一个注解将用于什么地方,可能的ElementType参数包括:(以下参数应均为大写)

Constructor:构造器的声明
Field:域声明(包括enum实例)
Local_variable:局部变量声明
Method:方法声明
Package:包声明
Parameter:参数声明
Type:类、接口(包括注解类型)或enum声明

(2)@Retention:表示需要在什么级别保存该注解信息。可选的retentionPolicy参数包括:

SOURCE:只存活在源码时期,被编译器丢弃。
CLASS:在字节码文件存活,但被vm丢弃
RUNTIME:在运行时保留注解,因此可以通过反射机制读取注解信息

(3)@Document:将此注解包含在javadic中。有该注解,将被javadoc工具提取成文档。

(4)@Inherit:允许子类继承父类的注解

3、编写注解处理器

3.1 注解元素

初识Java注解(分享笔记)_第3张图片

注解元素看起来就像接口的方法,唯一的区别是可以为其指定默认值。另外,注解元素不需要任何修饰符,但也允许用public(会提示public对于注解是多余的)。
注解的可用类型:
1、所有基本类型(int、float、boolean等)
2、String
3、Class
4、enum
5、Annotation
6、以上类型的数组
注意⚠️:
1、一旦使用了其他类型,编译器就会报错。
2、注解也可以作为元素的类型,也就是说,注解可以嵌套。

3.2 默认值限制

编译器对元素的默认值非常挑剔。

首先,元素不能有不确定的值。也就是说,元素必须要么有默认值,要么在使用注解时提供元素的值。
初识Java注解(分享笔记)_第4张图片
初识Java注解(分享笔记)_第5张图片

其次,对于非基本类型的元素,无论是在源代码中声明时,还是在注解接口定义默认值时,都不能以null作为其值。
为了绕开这个约束,我们自己可以定义一些特殊的值,以此来代表某个元素不存在。(如:空字符串或负数)

待续…

注意:注解需要通过发射来实现,然而反射需要花费较多的时间,所以在使用注解的时候,要注意考虑到时间成本。

你可能感兴趣的:(笔记)