一、需求
需求:当主方法执行后,会自动执行被检测的所有方法(加了Check注解的方法),判断方法是否有异常,记录到文件中
Calculator类:
import demo.Check; /* 小明定义的计算机类 */ public class Calculator { //加法 @Check public void add() { String str = null; str.toString(); 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注解:
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类:
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 简单的测试框架 * * 当主方法执行后,会自动执行被检测的所有方法(加了Check注解的方法),判断方法是否有异常,记录到文件中 */ public class TestCheck { public static void main(String[] args) throws IOException { //1、创建计算器对象 Calculator c = new Calculator(); //2、获取字节码文件对象 Class cls = c.getClass(); //3、获取所有方法 Method[] methods = cls.getMethods(); int number = 0;//出现异常的次数 BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt")); for (Method method : methods) { //4、判断方法上是否有Check注解 if (method.isAnnotationPresent(Check.class)) { try { method.invoke(c); } catch (Exception e) { //6、捕获异常 //记录到文件中 number++; bw.write(method.getName() + "方法出异常了"); bw.newLine(); bw.write("异常的名称:" + e.getCause().getClass().getSimpleName()); bw.newLine(); bw.write("异常的原因:" + e.getCause().getMessage()); bw.newLine(); bw.write("---------------------"); bw.newLine(); } } } bw.write("本次测试一共出现" + number + "次异常"); bw.flush(); bw.close(); } }
二、运行结果
控制台:
记录异常的文件(bug.txt):
三、结论结论
1、大多数的时候是使用注解,而不是自定义注解
2、注解给谁用,编译器和解析给程序用
3、注解不是程序的一部分,可以理解为注解就是一个标签