注解简介

注解可以加在类上边,成员变量上,方法上,方法参数上.

注解是用来完成功能的,每一个注解都可以完成一些功能.

常用注解

@Override 检查方法是否是重写父类的方法

@FunctionalInterface 检查接口是否是函数式接口

@Deprecated 标注方法已经过时,不推荐使用

自定义注解

注意啊,interface前边有个@,这是自定义注解,不是接口。

public @interface Student{
	String name();    //属性没有默认值,使用时必须指定值。
	int age() default 0 ;  //有默认值,使用时,可以不给,也可以给。
	String[] hobbies();  //数组格式,按照数组格式赋值,只有一个时,可以省略大括号。
}

//这样使用。
@Student(name="小老犇",hobbies={"放牛","吃草"})
public void abc(){
	sout("注解使用");
}

注解中属性的数据类型一共有三种:

  • 八种基本数据类型(byte short int long float double boolean char)
  • Class, String, 枚举, 注解
  • 以上所有类型的类型数组。

元注解

元注解也是注解

元注解用来修饰注解的注解

元注解要加在注解上面 作用是对注解进行限制

@Target

限制注解的使用位置 。

javaDI的作用 java @的作用_spring


@Target原理

@Target中只有一个属性叫做value.这个属性是ElementType[]

ElementType是一个枚举,枚举是一个特殊的类,枚举中每一个属性都是自身类型,枚举中的属性可以通过枚举名直接调用。

javaDI的作用 java @的作用_编程语言_02

@Retention

限制注解的生命周期。

@Retention原理

@Retention只有一个属性叫做value,这个属性是RetentionPolicy类型,同样是枚举类型。

javaDI的作用 java @的作用_反射_03


javaDI的作用 java @的作用_编程语言_04


找一个经常使用的注解点进去,看看。

javaDI的作用 java @的作用_反射_05

解析注解

解析注解,基于反射。解析注解时,需要使用Class对象和Method对象和Field对象,使用这些对象获取注解

而这些对象需要使用反射获取。

获取注解中的内容(比如属性),并进行处理.

Annotation接口 所有的注解默认实现该接口

AnnotatedElement 接口,里面定义了很多方法操作注解

相关API

getAnnotations() 获取所有注解

getAnnotation(Class annotationClass) 获取指定注解 传递哪个注解的Class,获取的就是谁的注解

boolean isAnnotationPresent(Class annotationClass) 判断指定注解是否存在,参数是注解的Class.

以上API的由谁来调用,要看这个注解注解的是类还是方法还是成员变量:

是类就用实例类的Class对象调用.获取该实体类上边的注解。

是方法就用Method对象调用。

是成员变量就用Field对象调用.。