1.注解
1、注解也被称为元数据,用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息
2、和注释一样,注解不影响程序逻辑、但参与编译或运行,相当于嵌入在代码中的补充信息
3、在JavaSE中,注解的使用目的较为简单,在JavaEE中注解占据了更为重要的角色,例如用来配置应用程序的任何切面
4、注解的本质就是接口,该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation
2.基本Annotation介绍
使用Annotation时要在前面加@符号,并把该Anotation当成一个修饰符使用,用于修饰它支持的程序元素
三个基本的Annotation:
1、@Override:限定某个方法,是重写父类方法,该注解只能用于方法
2、@Deprecated:用于表示某个程序元素(类、方法等)已过时
3、@SuppressWarnings:抑制编译器警告
3.元注解
1、Retention 指定注解的作用方位,三种Source,class,runtime,
2、Target 指定注解在哪些地方可以使用
3、Documented 指定该注解是否在javadoc体现
4、inherited 子类会继承父类注解
// 5. 元注解
// @Target:描述注解能够作用的位置
//* ElementType取值:
//** TYPE:可以作用到类上
//** METHOD:可以作用于方法上
//** FILED:可以作用于字段
// @Retention:描述注解保留的阶段
//* RetentionPolicy取值:
//** RetentionPolicy.RUNTIME:当前的注解会被保留到class字节码文件中,并被jvm读取到
// @Documented:描述注解是否被抽取到api文档中
// @Inherited:描述注解是否被子类继承
4.注解中的属性
1、属性的返回值类型有以下种类:String、枚举、注解或者是三种类型的数组
2、定义了属性,在使用时需要给其赋值操作
2.1、如果定义属性时,使用default关键字给默认属性初始化值,则使用注解时,可以不进行属性的赋值
2.2、如果只有一个属性需要赋值,并且属性的名称为value,则value可以省略,直接定义即可使用
2.3、 数组赋值时,值使用{}包括,如果数组中只有一个值,则{}省略
3、解析注解
@Pro(className = "junit.Calculate", methodName = "add" )
public class ReflectTest {
public static void main(String[] args) {
/**
* 解析注解
*/
//1. 获取该类的字节码对象
Class<ReflectTest> reflectTestClass = ReflectTest.class;
//2. 获取上边的注解对象
Pro annotation = reflectTestClass.getAnnotation(Pro.class);
//该方法实际上在内存中生成了一个该注解接口的子类实现对象,并有className和methodName方法
//3. 调用注解对象中定义的抽象方法,获取返回值
String className = annotation.className();
String methodName = annotation.methodName();
System.out.println(className + methodName);
}
}