-
Annotation是从JDK5.0开始引入的新技术
-
Annotation的作用:
-
文档生成:生成命令javadoc +类名。
- 作用在类上
- @author:创建人
- @version:类版本
- @since:描述此类从那个jdk版本开始
- 作用在方法上
- @param:描述参数
- @return:表述返回值
- 作用在类上
-
分析代码:通过反射机制可以获得指定类,标识的注解信息,来进行代码分析。
-
编译检查:通过注解可以对代码进行一般的错误检查,例如:@Override
-
-
Annotation的格式:
- 注解是以"@注解名"在代码中存在的,可以添加一些参数值,例如:@SuppressWarnings(value=“All”)。
-
Annotation在哪里使用?
- 可以添加在package、class、method、field等上面,相当于给他们加了些辅助信息,我们可以通过反射机制实现对这些注解的访问。
- @Override:定义在java.lang.Override中,检查是否重写了父类方法。
- @Deprecated:定义在Java.lang.Deprecated中,标识已过期,已不推荐使用。
- @SuppressWarnings:定义在java.lang.SuppressWarnings中,压制警告,需要传递一个参数,一般使用@SuppressWarnings(“All”),表示压制所有类型的警告。@SuppressWarnings()注解参数大全
-
自定义注解格式
public @interface AnnoTest {} -
注解本质
public interface AnnoTest extends java.lang.annotation.Annotation {} -
注解属性:就是接口中的抽象方法
- 方法返回值可以定义为:基本类型,String字符串,枚举类型,注解类型,以上类型的数组类型。
- 定义了属性后使用注解的时候就需要给其赋值。
- 定义属性的时候,如果给属性使用了default,在使用的时候就可以不用赋值,默认使用默认值。
- 如果注解只有一个属性,属性的名字可以定义为value,使用的时候可以省略不写。
- 数组赋值的时候,需要使用[]包裹,如果数组只有一个值,[]可以省略不写。
-
元注解:描述注解的注解
-
@Target:用于描述注解的使用位置
public enum ElementType { TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE, TYPE_PARAMETER, TYPE_USE } -
@Retention:用于描述注解被保留的阶段
public enum RetentionPolicy { SOURCE, CLASS, RUNTIME } -
@documented:生成文档时是否保留注解到API
-
@Inherited:注解是否可以被子类继承
-
需求:测试Calculation运算类加减乘除有没有bug。
-
自定义注解类
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface AnnoTest { } -
Calculation运算类
public class Calculation { @AnnoTest public void add(){ System.out.println("我是加法1+1="+(1+1)); } @AnnoTest public void subtract(){ System.out.println("我是减法2-1="+(2-1)); } @AnnoTest public void multiply(){ System.out.println("我是乘法1*1="+(1*1)); } @AnnoTest public void divide(){ System.out.println("我是除法1/0="+(1/0)); } } -
执行类
public class TestMain { public static void main(String[] args) throws IOException { BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("bug.txt")); int sum =0; //1、获取运算对象 Calculation calculation = new Calculation(); //2、获取对象calss类 Class aClass = calculation.getClass(); //3、获取所有方法 Method[] methods = aClass.getMethods(); for (Method method : methods) { //4、遍历是否带注释 if(method.isAnnotationPresent(AnnoTest.class)){ try { //5、带注释的执行 method.invoke(calculation); } catch (Exception e) { sum++; //6、出异常后写到日志文件 bufferedWriter.write(method.getName()+"方法出现异常!"); bufferedWriter.newline(); bufferedWriter.write("异常名称 是:"+e.getCause().getClass().getSimpleName()); bufferedWriter.newline(); bufferedWriter.write("异常原因:"+e.getCause().getMessage()); bufferedWriter.newline(); bufferedWriter.write("-------------------------------------------"); bufferedWriter.newline(); } } } bufferedWriter.write("本次测试一共出现"+sum+"次异常"); bufferedWriter.flush(); bufferedWriter.close(); } } -
结果



