1.注解的概念
(1)注释的概念:
说明程序,给计算机看的
(2)注解的定义:
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。注解的本质是标记,他所有的功能都依赖于对于这个注解解释性的代码,通常需要结合反射来编写解释性代码。
(3)作用分类:
①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
使用javadoc 类名.java命令,打开index.html文件
②代码分析:通过代码里标识的注解对代码进行分析【使用反射】
③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
(4)注解目前而言最主流的应用就是代替配置文件,例如Spring、SpringBoot等,注解具有开发效率高,成本低的特点,缺点是耦合性高,不利于维护。
2.JDK中预定义的一些注解
(1)@Override:检测被该注解标注的方法是否是继承自父类(接口)的
(2)@Deprecated:该注解标注的内容,表示已过时
(3)@SuppressWarnings:压制警告(一般传递参数all)
(4)@FunctionalInterface:如果一个接口中只有一个抽象方法,则该接口可以使用该注解修饰
3.自定义注解
3.1 格式
元注解
public @interface 注解名称{
属性列表;
}
3.2 本质
public interface 类名 extends java.lang.annotation.Annotation{ }
3.3属性
属性指的是接口中的抽象方法
(1)属性的返回值类型有以下取值
①基本数据类型
②String
③枚举
④注解
⑤以上类型的数组
(2)定义了属性,在使用时需要给属性赋值
①如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值
②如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可
③数组赋值时,值使用大括号{}包裹。如果数组中只有一个值,则{}可以省略
3.4 元注解
元注解就是用于描述注解的注解
(1)@Target:描述注解能够作用的位置(@Target的值是枚举类ElementType中的值)
(2)@Retention:描述注解被保留在哪个阶段可以被反射机制读取到
实例:
@Retention(value = RetentionPolicy.RUNTIME) public @interface MyAnnotation { public String name(); }
(3)@Documented:描述注解是否被抽取到api文档中
(4)@Inherited:描述注解是否被子类继承
3.5 在程序中使用(解析)注解
获取注解中定义的属性值
(1)获取注解定义的位置的对象(Class,Method,Field)
(2)获取指定的注解
getAnnotation(Class)
(3)调用注解中的抽象方法获取配置的属性值
3.6 注解应用需要的三个步骤
(1)编写注解
@Retention(RetentionPolicy.CLASS) @Target({ElementType.TYPE}) @Documented public @interface MyAnnotation { public String name(); public int age();//给变量设置默认值 public String[] like();//定义一个数组变量 }
(2)在类上应用注解
@MyAnnotation(name = "tom",age = 5,like = {"金鱼", "鲤鱼"}) public class Cat { private String name; private int age; private String[] like; // Getter/Setter,toString,构造方法
(3) 对应用了注解的类进行反射操作的类
public class AnnotationDemo { public static void main(String[] args) { Class<Cat> catClass = Cat.class; // 获取类上应用的的指定注解 MyAnnotation annotation = catClass.getAnnotation(MyAnnotation.class); // 获取注解上变量值 int age = annotation.age(); String[] like = annotation.like(); try { Cat cat = catClass.newInstance(); cat.setAge(age); cat.setLike(like); System.out.println(cat); } catch ( InstantiationException e) { e.printStackTrace(); } catch ( IllegalAccessException e) { e.printStackTrace(); } } }