1.注解
1.1 概述
annotation,是一种代码级别的说明,和类 接口平级关系.
注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,以后,javac编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无标记,看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上定义
1.2注解的作用
执行编译期的检查 例如:@Override
分析代码(主要用途:替代配置文件); 用在框架里面, 注解开发
1.3 JDK提供的三个基本的注解
@Override:描述方法的重写.
@SuppressWarnings:压制警告.
@Deprecated:标记过时
2.自定义注解
2.1 注解格式
定义一个类:class
定义一个接口:interface
定义一个枚举:enum
定义一个注解:@interface
本质上就是一个接口,接口中可以定义变量(常量)和方法(抽象),注解中的方法叫注解属性
语法: @interface 注解名{}
/**
* 定义了注解
*
*/
public @interface Annotation01 {
}
2.2 注解属性
-
属性类型
1.基本类型
2.String3.枚举类型
4.注解类型
5.Class类型
6.以上类型的一维数组类型
一旦注解有属性了,使用注解的时候,属性必须有值
/**
*注解的属性; 格式和接口的方法很类似
* 1.基本类型
2.String
3.枚举类型
4.注解类型
5.Class类型
6.以上类型的一维数组类型
*/
public @interface Annotation02 {
int a();//基本类型
String b();//String
Color c();//枚举类型
Annotation01 d();//注解类型
Class e();//Class类型
String[] f();//一维数组类型
}
- 注解属性赋值
格式
@注解名(属性名=值,属性名2=值2)
eg:@MyAnnotation3(i = 0,s="1")
- 注意
若属性类型的一维数组的时候,当数组的值只有一个的时候可以有以下下两种写法
@MyAnnotation4(ss = { "a" })
@MyAnnotation4(ss = "a")
若属性名为value的时候,且只有这一个属性需要赋值的时候可以省略value
@MyAnnotation5(value = "a")
==>@MyAnnotation5( "a")
注解属性可以有默认值
属性类型 属性名() default 默认值;
3.元注解
3.1 概述
定义在注解上的注解
3.2 类型
@Target:定义该注解作用在什么上面(位置),默认注解可以在任何位置. 值为:ElementType的枚举值
METHOD:方法
TYPE:类 接口
FIELD:字段
CONSTRUCTOR:构造方法声明
@Retention:定义该注解保留到那个代码阶段, 默认只在源码阶段保留 值为:RetentionPolicy类型
SOURCE:只在源码上保留(默认)
CLASS:在源码和字节码上保留
RUNTIME:在所有的阶段都保留
.java (源码阶段) ----编译—> .class(字节码阶段) ----加载内存–> 运行(RUNTIME)
4.注解解析
java.lang.reflect.AnnotatedElement
-
T getAnnotation(ClassannotationType):得到指定类型的注解引用。没有返回null。
-
boolean isAnnotationPresent(Class<?extends Annotation> annotationType):判断指定的注解有没有。
Class、Method、Field、Constructor等实现了AnnotatedElement接口. -
Annotation[] getAnnotations():得到所有的注解,包含从父类继承下来的。
-
Annotation[] getDeclaredAnnotations():得到自己身上的注解。
public @interface Annotation01 {
}
@Annotation01
class Demo01{
@Annotation01
public void fun01(){
}
}
//解析注解
//1. 获得Demo01字节码
Class clazz = Demo01.class;
//2. 获得注解的引用(对象), 有就返回引用, 没有就返回null
Annotation01 annotation01 = clazz.getAnnotation(Annotation01.class);
//3. 反射获得fun01()方法对象
Method method = clazz.getMethod("fun01");
//4. 判断当前的方法上面是否有Annotation01注解; 如果有就返回true, 没有就返回false
boolean flag = method.isAnnotationPresent(Annotation01.class);