注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
使用注解:@注解名称
作用分类:
编写文档:通过代码里表示的元数据生成文档【生成doc文档】
代码分析:通过代码里标识的元数据对diamagnetic进行分析【使用反射】
编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
JDK一些预定义注解
@Override
检测被该注解标注的方法是否是继承父类(接口)的
@Deprecated
该注解标注的内容表示已过时
@SuppressWarnings
压制警告(@SuppressWarnings("all")压制所有警告)
自定义注解
格式:
元注解
public @注解名称{
属性列表
}
本质:注解本质是一个继承java.lang.annotation.Annotation接口的接口
public interface MyAnno extends java.lang.annotation.Annotation{}
属性:接口中的抽象方法
方法返回值数据类型有要求
基本数据类型
String
枚举
注解
以上类型的数组
定义了属性,使用时需要给属性赋值
如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
如果只有一个属性需要复名称制,并且属性名称是value,则value可以省略,直接定义值。
数组赋值时,使用{}包裹,如果数组中只有一个值,则{}可以省略。
元注解:用于描述注解的注解
@Target:描述注解作用的位置
ElementType取值:
TYPE:作用在类上
METHOD:作用在方法上
FIELD:作用于成员变量上
@Retention:描述注解保留的阶段
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保存到class字节码文件中,并被JVM读取 到
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被字类继承
解析注解:获取注解中定义的属性值
案例:利用注解为反射注入类全路径名和方法名
创建Demo1、Demo2两个测试类
public class Demo1 {
public void show(){
System.out.println("Demo1 show");
}
}
public class Demo2 {
public void show(){
System.out.println("Demo2 show");
}
}
创建注解Pro
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
String className();
String methodName();
}
编写测试类
import java.lang.reflect.Method;
@Pro(className = "cn.zjut.annotation.Demo2", methodName = "show")
public class ReflectTest {
public static void main(String[] args) throws Exception {
//解析注解
//获取本类字节码对象
Class<ReflectTest> reflectTestClass = ReflectTest.class;
//利用本类字节码对象的getAnnotation()获取注解对象
Pro pro = reflectTestClass.getAnnotation(Pro.class);
//获取注解的属性值
String className = pro.className();
String mehtodName = pro.methodName();
System.out.println(className);
System.out.println(mehtodName);
Class cls = Class.forName(className);
Object obj = cls.newInstance();
Method method = cls.getMethod(mehtodName);
method.invoke(obj);
}
}
解析注解步骤总结:获取注解定义位置的对象(Class、Method、Field)、获取指定的注解对象(getAnnotation(Class clazz))、调用注解中的抽象方法获取配置的属性值