Java注解基础
1. 注解(Annotation)
- 位于源码中(代码/注释/注解),使用其他工具进行处理的标签
- 注解用来修饰程序的元素,但不会对被修饰的对象有直接的影响
- 只有通过某种配套的工具才会对注解信息进行访问和处理
- 主要用途
- 提供信息给编译器/IDE工具
- 可用于其他工具来产生额外的代码/配置文件等
- 有一些注解可在程序运行时访问,增加程序的动态性
普通自带注解:(直接修饰JAVA对象)
- @Override 表示继承和改写
- @Deprecated 表示废弃
- @SuppressWarnings 表示压制警告
- @SafeVarargs 不会对不定项参数做危险操作
- @FunctionInterface 声明功能性接口
元注解:(可以修饰注解)
- @Target 设置目标范围
- @Retention 设置保持性
- @Documented 文档
- @Inherited 注解继承
- @Repeatable 此注解可以重复修饰
自定义注解:
2. 普通注解
-
@Override
- 修饰方法,检查该方法是父类的方法,如果不是编译器会报错
- 避免代码错误
-
@Deprecated
- 修饰类/类的元素/包
- 标注为废除,建议程序员不再使用这个类/元素/包
-
@SuppressWarnings("")
- 可以修饰变量/方法/构造函数/类等
- 压制各种不同类型的警告信息,使得编译器不显示警告
- @ SuppressWarnings 常用警告类型:
- @SuppressWarnings("all"),忽略所有的警告
- @SuppressWarnings("cast"),忽略类转型警告
- @SuppressWarnings("serial"),忽略实现Serializable接口的,没有定义serialVersionUID
- deprecated,unchecked
- 使用javac -X 可以看当前的编译器使用哪些警告类型
3. 元注解
元注解是用来修饰注解的注解,修饰定义的注解
-
@Retention(保留注解)
-
这个注解用来修饰其他注解的存在范围
-
@Retention(RetentionPolicy.SOURCE) 注解仅存在.java,不在class文件。(不能通过反射获取)
-
@Retention(RetentionPolicy.CLASS) 这是默认的注解保留策略。注解存在于.class文件,但是不能被JVM加载。(不可以通过反射获取)
-
@Retention(RetentionPolicy.RUNTIME) 这种策略下,注解可以被JVM运行时加载和访问。通常情况下,可以结合反射来做一些事情。(可以通过反射获取)
-
java编译过程.java-->.class-->JVM
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface RuntimeAnnotation { } @RuntimeAnnotation public class C1 { } Class c1 = Class.forName("retentions.C1"); System.out.println(c1.getAnnotations());//可以通过反射获取
-
-
@Target:限定目标注解作用于什么位置@Target({ElementType.METHOD,ElementType.FIELD})
- ElementType.ANNOTATION_TYPE(注:修饰注解)
- ElementType.CONSTRUCTOR
- ElementType.FIELD
- ElementType.LOCAL_VARIABLE
- ElementType.METHOD
- ElementType.PACKAGE
- ElementType.PARAMETER
- ElementType.TYPE(任何类型,即上面的的类型都可以修饰)
-
@Inherited(继承注解)
- 让一个类和它的子类都包含某个注解,一个类的父类使用这个注解时,类的所有子类会有这个注解
- 普通的注解没有继承功能
-
@Documented
- 指明这个注解可以被Javadoc工具解析,形成帮助文档
4. 自定义注解
注解使用@interface来声明,注解都是扩展至annotation接口,有参数的注解应该赋值
-
声明注解
注解可以包括的类型:8种基本类型(int/short/long/float/double/byte/char/boolean),String,Class,enum,注解类型,由前面类型组成的数组成员变量可以使用多种类型,可以设置默认值,也可以不设置默认值
@Retention(RetentionPolicy.RUNTIME) //表示该注解会保留在class文件中 @Target(ElementType.METHOD) //表示该注解只能用于方法 public @interface MultipleTest { int a() default 0; int b() default 0; }
-
可以给JAVA注解赋初值
@MultipleTest(a=1,b=1) public int test1(){} @MultipleTest(b=1,a=1) public int test2(){}