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)注解不是程序的一部分
可以把注解理解为标签,加不加这个标签,那个方法仍然可以使用