注解-案例

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)注解不是程序的一部分

  可以把注解理解为标签,加不加这个标签,那个方法仍然可以使用

posted @ 2020-10-30 23:42  GumpYan  阅读(165)  评论(0编辑  收藏  举报