☕ Java注解-笔记
2022-03-20 20:29
543 查看
什么是注解
注解(Annotation)是放在Java源码的类、方法、字段、参数前的一种特殊”注释“。
注释会被编译器直接忽略,注解则可以被编译器打包进入class文件,因此,注解是一种用作标注的“元数据”,一种接口类型。
注解的作用
注解并不能改变程序的运行结果,也不会影响程序运行的性能。有些注解可以在编译时给用户提示或警告,有的注解可以在运行时读写字节码文件信息。
- 生成帮助文档。常用有
@see、@param、 @return
- 跟踪代码依赖性,实现替代配置文件功能。(常见的是 Spring 2.5 开始的基于注解配置,作用就是减少配置。)
- 在编译时进行格式检查。
常用注解
@Override
:用来指定方法重写的,只能修饰方法并且只能用于方法重写,不能修饰其它的元素。@Deprecated
:用来注解类、接口、成员方法和成员变量等,用于表示某个元素(类、方法等)已过时。当其他程序使用已过时的元素时,编译器将会给出警告。Java 9 为 @Deprecated 注解增加了以下两个属性:
forRemoval
:该 boolean 类型的属性指定该 API 在将来是否会被删除。since
:该 String 类型的属性指定该 API 从哪个版本被标记为过时。public class DeprecatedTest { public static void main(String[] args) { new Test().print(); } } class Test { @Deprecated(since="6", forRemoval=true) public void print() { System.out.println("啊对对对"); } }
@SuppressWarnings:被该注解修饰的程序元素(及其所有子元素)取消显示指定的编译器警告,且会一直作用于该程序元素的所有子元素。
注解的使用有以下三种:抑制警告关键字
-
抑制单类型的警告:
@SuppressWarnings("unchecked")
@SuppressWarnings("unchecked","rawtypes")
@SuppressWarnings("unchecked")
使用
@SuppressWarnings({ "deprecation" })注解了HelloWorld.java 的 main 方法:
程序代码的警告没有了
@SafeVarargs:用来抑制调用可变参数方法时,提供的参数类型不一致的警告。
不适用于非 static 或非 final 声明的方法。
定义注解
public @interface Report { int type() default 0; String level() default "info"; String value() default ""; } // 注解的参数类似无参数方法
元注解
元注解(meta annotation),负责对其它注解进行说明的注解,自定义注解时可以使用元注解。
@Target
:最常用的元注解使用
@Target
可以定义Annotation
能够被应用于源码的哪些位置: 类或接口:ElementType.TYPE
;- 字段:
ElementType.FIELD
; - 方法:
ElementType.METHOD
; - 构造方法:
ElementType.CONSTRUCTOR
; - 方法参数:
ElementType.PARAMETER
。
// 定义注解@Report用在方法上 @Target(ElementType.METHOD) public @interface Report { int type() default 0; ... } // 定义注解@Report可用在方法或字段上 @Target({ ElementType.METHOD, ElementType.FIELD }) public @interface Report { ... }
@Retention
用于描述注解的生命周期,也就是该注解被保留的时间长短:
@Retention注解中的成员变量(value)用来设置保留策略,value 是
java.lang.annotation.RetentionPolicy枚举类型,
RetentionPolicy有 3 个枚举常量
-
仅编译期:
RetentionPolicy.SOURCE;
仅class文件:
RetentionPolicy.CLASS;
-
运行期:
RetentionPolicy.RUNTIME。
如果
@Retention不存在,则该
Annotation默认为
CLASS。通常自定义的
Annotation都是
RUNTIME,所以必须加上
@Retention(RetentionPolicy.RUNTIME)这个元注解
@Inherited
-
使用
@Inherited定义子类是否可继承父类定义的注解
@Target(ElementType.TYPE)类型的注解有效
定义注解完整步骤
- 用@interface定义注解
- 添加参数、默认值
- 用元注解配置注解
// 3. 用元注解配置注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Report { // 1. 用@interface定义注解 // 2. 添加参数、默认值 int type() default 0; String level() default "info"; String value() default ""; }
注解分类
根据注解是否包含成员变量,可以分为如下两类。
- **标记注解:**没有定义成员变量的注解类型被称为标记注解。这种注解仅利用自身的存在与否来提供信息,如前面介绍的 @Override、@Test 等都是标记注解。
- **元数据注解:**包含成员变量的注解,因为它们可以接受更多的元数据,所以也被称为元数据注解。
抑制警告关键字
关键字 | 用途 |
---|---|
all | 抑制所有警告 |
boxing | 抑制装箱、拆箱操作时候的警告 |
cast | 抑制映射相关的警告 |
dep-ann | 抑制启用注释的警告 |
deprecation | 抑制过期方法警告 |
fallthrough | 抑制在 switch 中缺失 breaks 的警告 |
finally | 抑制 finally 模块没有返回的警告 |
hiding | 抑制相对于隐藏变量的局部变量的警告 |
incomplete-switch | 忽略不完整的 switch 语句 |
nls | 忽略非 nls 格式的字符 |
null | 忽略对 null 的操作 |
rawtypes | 使用 generics 时忽略没有指定相应的类型 |
restriction | 抑制禁止使用劝阻或禁止引用的警告 |
serial | 忽略在 serializable 类中没有声明 serialVersionUID 变量 |
static-access | 抑制不正确的静态访问方式警告 |
synthetic-access | 抑制子类没有按最优方法访问内部类的警告 |
unchecked | 抑制没有进行类型检查操作的警告 |
unqualified-field-access | 抑制没有权限访问的域的警告 |
unused | 抑制没被使用过的代码的警告 |
相关文章推荐
- Java 学习笔记05:Spring 基于注解(Annotation)的IOC
- Java 学习笔记06:Spring 基于注解(Annotation)的AOP
- JAVA注解(Annotation)相关学习笔记
- java笔记1(策略、代理模式、枚举、反射、注解)
- Java学习笔记 线程,注解(注释)...
- java注解学习笔记
- Java注解学习笔记
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
- 黑马程序员--【强哥笔记】系列之Java高新技术笔记之注解(第5天)
- Effective Java 阅读笔记——枚举和注解
- 0035 Java学习笔记-注解
- java笔记--springMessage处理自定义注解
- 17.笔记JAVA Spring框架学习————基于注解配置Bean之一
- java学习笔记--注解
- Java基础笔记9——反射、Junit、注解、单例模式
- 《编写高质量代码改善Java程序的151个建议》学习笔记 第6章 枚举和注解
- 【黑马程序员】 学习笔记 - Java新技术 - 注解
- java笔记-高新技术-注解、类加载器、代理
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
- java基础巩固笔记(6)-注解