概念
说明程序的。给计算机看的
注解定义
注解(Annotation),也叫元数据是一种代码级别的说明。它是jdk1.5及以后版本引入的一个新特性。与接口,类,枚举
是在同一层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明
注解作用
1.编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
步骤:创建对象,标注注解
然后打开DOS命令窗口,
javadoc 文件名.java
/** *注解javadoc演示 * * @author itcast * @version 1.0 * @since 1.5 * * */ public class AnnoDom1 { /** * 计算两数的和 * @param a 整数 * @param b 整数 * @return 两数的和 * */ public int add(int a,int b){ return a+b; } }
2.代码分析:通过代码里标识的注解对代码进行分析【使用反射】
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Pro { String className(); String methodName(); }
@Pro(className = "cn.itcast.annotation4.Student",methodName = "show") public class ReflectTest { public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Class<ReflectTest> reflectTestClass = ReflectTest.class; Pro annotation = reflectTestClass.getAnnotation(Pro.class); String className = annotation.className(); String methodName = annotation.methodName(); Class<?> cls = Class.forName(className); Object obj = cls.newInstance(); Method method = cls.getMethod(methodName); method.invoke(obj); } }
3.编译检测:通过代码里标识的注解让编译器能够实现基本的编译检测
注解本质
/*注解本质就是一个接口,该接口默认继承Annotation接口*/ public interface MyAnno extends java.lang.annotation.Annotation{}
注解中可以定义属性
属性:就是抽象方法,定义了属性使用时需要给属性赋值
1.如果定义属性时,使用default关键字给属性默认初始化值则使用注解时可以不进行属性赋值
2.如果只有一个属性需要赋值,并且属性的名称是value,可以直接定义值就可以
3.数组赋值时,值用大括号包裹,如果数组中只有一个值,则大括号可以省略
JDK中预定义的注解
@Override:检测被该注解标注的方法是否是继承自父类(接口)的
@Deprecated:该注解标注的内容,表示已过时
@SuppressWarnings 压制警告
一般传递参数all @SuppressWarnings("all")
自定义注解
格式
元注解
public @interface 注解名称{
属性列表
1.基本数据类型
2.字符串
3.枚举
4.注解
5.value
6.以上类型数组数组
}
public @interface MyAnno { int age(); String name() default "张三"; Season season(); MyAnno2 anno2(); String[] str(); }
@MyAnno(age = 12,season = Season.SPRING,anno2=@MyAnno2,str = {"1"}) public class worker { }
元注解:
用来描述注解的注解
@Target(ElementType.取值) 描述注解能够作用的位置
取值:
TYPE:可以作用于类上 METHOD:可以作用于方法上 FIELD:可以作用于成员变量上
@Retention(RetentionPolicy.RUNTIME)描述注解被保留的三个阶段
@Documented:描述注解是否被抽取到API文档中
@Inherited:描述注解是否被子类继承
public class AnnoDemo { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException { // 1.通过反射获取userTest类的字节码文件 Class<?> clazz = Class.forName("cn.itcast.annotation2.UseTest"); UseTest useTest = (UseTest) clazz.newInstance(); //2.通过反射获取这个类里面所有的方法对象 Method[] methods = clazz.getMethods(); //遍历数组,得到每一个方法对象 for (Method method : methods) { //method依次表示每一个方法对象 //isAnnotationPresent(Class<? extends Annotation> annotation) //判断当前方法是否有指定的注解 //参数:注解的字节码文件对象 //返回值true存在,false不存在 if (clazz.isAnnotationPresent(Test.class)){ method.invoke(useTest); } } } }
在程序使用(解析)注解
获取注解中定义的属性值
步骤
1.获取注解定义的位置的对象
2.获取指定的注解
getAnnotation(Class)获取注解对象
3.调用注解中的抽象方法获取配置的属性值