10分钟深刻理解 Java高级—— 注解
Posted 高、远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10分钟深刻理解 Java高级—— 注解相关的知识,希望对你有一定的参考价值。
文章目录
【1】什么是注解?
- Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
注解是元数据的一种形式,提供有关于程序但不属于程序本身的数据。注解对它们注解的代码的操作没有直接影响。
- 注解不是对注解的代码的操作没有直接影响吗?为什么注解还在Java中如此重要?如何心中还存在这个问题,那么请你一定把这篇博客看完!
【2】注解有什么用?
对于注解的代码部分,可以在程序执行的不同阶段中,根据需求对不同注解标记过的代码进行不同的二次处理,最终影响程序执行。
- 说白了就是将添加注解的部分,进行特殊标记,让计算机能够认识。
【3】如何使用注解?
一、如何声明注解?
与声明一个"Class"不同的是,注解的声明使用@interface
关键字。
如:
public @interface Lance{
}
二、什么是元注解?
在定义注解时,注解类也能够使用其他的注解声明。对注解类型进行注解的注解类,我们称之为 meta-annotation(元注解)。
说白了就是对定义的注解进行注解的那4个语句:
@Target()
@Retention()
@Documented
@Inherited
public @interface Anno {
}
①@Target
作用
注解标记另一个注解,以限制可以应用注解的 Java 元素类型。
目标注解指定以下元素类型之一作为其值:
ElementType.ANNOTATION_TYPE
可以应用于注解类型。ElementType.CONSTRUCTOR
可以应用于构造函数。ElementType.FIELD
可以应用于字段或属性。ElementType.LOCAL_VARIABLE
可以应用于局部变量。ElementType.METHOD
可以应用于方法级注解。ElementType.PACKAGE
可以应用于包声明。ElementType.PARAMETER
可以应用于方法的参数。ElementType.TYPE
可以应用于类的任何元素。
②@Retention
作用(特别重要)
首先明白几个过程:
- 我们写的
.java
文件是源码—>编译—>字节码.class
—>java虚拟机运行
注解指定标记注解的存储方式:
RetentionPolicy.SOURCE
- 标记的注解仅保留在源级别中,并被编译器忽略。RetentionPolicy.CLASS
- 标记的注解在编译时由编译器保留,但 Java 虚拟机(JVM)会忽略。RetentionPolicy.RUNTIME
- 标记的注解由 JVM 保留,因此运行时环境可以使用它。- @Retention 三个值中 SOURCE < CLASS < RUNTIME,即CLASS包含了SOURCE,RUNTIME包含SOURCE、CLASS。下文会介绍他们不同的应用场景。
RetentionPolicy.SOURCE
作用:RetentionPolicy.SOURCE ,
作用于源码级别的注解
,可提供给IDE语法检查
、APT
等场景使用。
只停留这源码阶段,编译为字节码文件后就丢掉该注解
RetentionPolicy.CLASS
作用:RetentionPolicy.SOURCE ,
作用于源码级别的注解
,可提供给IDE语法检查
、APT
等场景使用。
定义为CLASS的注解,会保留在class文件中,但是会被虚拟机忽略(即无法在运行期反射获取注解)。此时完全符合此种注解的应用场景为字节码操作。如:AspectJ、热修复Roubust中应用此场景。所谓字节码操作即为,直接修改字节码Class文件以达到修改代码执行逻辑的目的。在程序中有多处需要进行是否登录的判断。
只停留这源码阶段,编译为字节码文件后就丢掉该注解
RetentionPolicy.RUNTIME
作用:RetentionPolicy.SOURCE ,
作用于源码级别的注解
,可提供给IDE语法检查
、APT
等场景使用。
注解保留至运行期,意味着我们能够在运行期间结合反射技术获取注解中的所有信息。
③@Documented
作用
用于被javadoc工具提取成文档
④@Inherited
作用
表示允许子类继承父类中定义的注解。
有4个元注解,但我们平时通常使用两个元注解:Target
,Retention
以上是关于10分钟深刻理解 Java高级—— 注解的主要内容,如果未能解决你的问题,请参考以下文章