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(){}
















