• 注解-案例


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

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

  • 相关阅读:
    html5存储相关 coookie localstorage session storage
    LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)
    LeetCode 331. 验证二叉树的前序序列化(Verify Preorder Serialization of a Binary Tree) 27
    LeetCode 1047. 删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates In String)
    LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)
    【剑指offer】面试题 31. 栈的压入、弹出序列
    LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)
    LeetCode 946. 验证栈序列(Validate Stack Sequences) 26
    【剑指offer】面试题 14. 剪绳子
    LeetCode 343. 整数拆分(Integer Break) 25
  • 原文地址:https://www.cnblogs.com/GumpYan/p/13904865.html
Copyright © 2020-2023  润新知