注解 :Annotaction当我们进行框架配置的时候,XML中配置太多导致维护不方便,使用注解来减少配置文件,增加开发效率,注解就是在代码中添加信息,提供一种形式化的方法JDK1.5之后产生的新功能。
jdk内置注解:
@OverRide放在方法之前,如果加上此注解的方法不是复写超类的方法,就会报错
@Deprecated:声明程序已经过时,或者有更好的替代方案,不建议别人调用。
@SuppressWarnings:抑制编译器警告
元注解:简单的说就是定义在注解上的注解
@Target:声明注解用于什么地方
@Retention:注解的保存级别:
@Documented:会被javadoc提成文档
@Inherited:允许子类继承父类的注解
自定义注解(Annotation),也叫元数据:
一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
@Override是一个简单的编译时注解,它可以用来捕获类似于在子类中把toString()写成tostring()这样的错误。在Java5中,用户自定义的注解可以用注解处理工具(Anotation Process Tool ——APT)在编译时进行处理。到了Java6,这个功能已经是编译器的一部分了。
@Test是JUnit框架用来在运行时通过反射来决定调用测试类的哪个(些)方法的注解。
@Deprecated标记就表明这个方法已经过时了
@Override的时候就能想到这个方法是覆盖了某个接口的方法的。
@SuppressWarnings(“deprecation”)就表示我们忽略了deprecation这样的一个警告。
注解保持性策略
在Java编译器编译时,它会识别在源代码里添加的注解是否还会保留,这就是RetentionPolicy。下面是Java定义的RetentionPolicy枚举:
编译器的处理有三种策略:
将注解保留在编译后的类文件中,并在第一次加载类时读取它;
将注解保留在编译后的类文件中,但是在运行时忽略它;
按照规定使用注解,但是并不将它保留到编译后的类文件中。
注解分类:【源码注解→编译时注解→运行时注解】
源码注解:只在源码中存在,编译成.class文件就不存在了。
编译时注解:在源码和.class文件中都存在。像前面的@Override、@Deprecated、@SuppressWarnings,他们都属于编译时注解。
运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解。像@Autowired自动注入的这样一种注解就属于运行时注解,它会在程序运行的时候把你的成员变量自动的注入进来。
按照来源划分: 来自JDK的注解——来自第三方的注解——自定义注解
解析注解
概念:
通过反射获取类 、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。
测试类:
@Description("bb")
public static void main(String[] args) {
try {
// 使用类加载器加载类
Class c = Class.forName("com.anno.test");
// 找到类上面的注解
boolean isExist = c.isAnnotationPresent(Description.class);
// 上面的这个方法是用这个类来判断这个类是否存在Description这样的一个注解
if (isExist) {
// 拿到注解实例,解析类上面的注解
Description d = (Description) c.getAnnotation(Description.class);
System.out.println("111:"+d.value());
}
//获取所有的方法
Method[] ms = c.getMethods();
// 遍历所有的方法
for (Method m : ms) {
boolean isExist1 = m.isAnnotationPresent(Description.class);
if (isExist1) {
Description d1=m.getAnnotation(Description.class);
System.out.println(d1.value());
}
}
//另一种解析方法
for (Method m : ms) {
//拿到方法上的所有的注解
Annotation[] as=m.getAnnotations();
for (Annotation a : as) {
//用二元操作符判断a是否是Description的实例
if (a instanceof Description) {
Description d=(Description) a;
System.out.println(d.value());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}