1.案例概述
当我们想测试写的方法有没有异常,我们的测试框架,用注解写的,想验证这些方法中有没有异常,想验证哪个方法,就在这个方法上加上注解,测试框架运行之后,就会提示哪个地方有异常,有几个异常。
Calculator
package cn.yjg.day10.annotation.demo; /** * 小明定义的计算类 */ public class Calculator { // 加法 @Check public void add() { System.out.println("1+0=" + (1+0)); } // 减法 @Check public void sub() { System.out.println("1-0=" + (1-0)); } // 乘法 @Check public void mul() { System.out.println("1*0=" + (1*0)); } // 除法 @Check public void div() { System.out.println("1/0=" + (1/0)); } public void show() { System.out.println("永无bug"); } }
Check
package cn.yjg.day10.annotation.demo; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Check { }
TestCheck
package cn.yjg.day10.annotation.demo; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Method; /** * 简单的测试框架 * * 当主方法执行后,会自动执行被检测的所有方法(加了Check注解的方法),判断方法是否有异常,记录到文件中 */ public class TestCheck { public static void main(String[] args) throws IOException { // 1.创建计算器对象 Calculator calculator = new Calculator(); // 2.获取字节码文件对象 Class<? extends Calculator> aClass = calculator.getClass(); // 3.获取所有的方法 Method[] methods = aClass.getMethods(); // 定义出现异常的次数 int number = 0; // 定义记录的流对象 BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("bug.txt")); for (int i = 0; i < methods.length; i++) { Method method = methods[i]; // 4.判断方法上是否有Check注解 if (method.isAnnotationPresent(Check.class)) { // 5.有注解,就执行该方法,并捕获异常 try { method.invoke(calculator); } catch (Exception e) { // 6.捕获异常 // 记录到文件中 number ++ ; 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("本次测试一共出现"+number+" 次异常"); bufferedWriter.flush(); bufferedWriter.close(); } }
运行结果:
2.小结
(1)以后大多数时候,我们使用注解,而不是自定义注解
(2)注解给谁用?
编译器
编译器识别注解,检测编译有没有问题
给解析程序用
解析程序就是TestCheck里面的内容
(3)注解不是程序的一部分
可以把注解理解为标签,加不加这个标签,那个方法仍然可以使用