• 模拟 Junit 框架


     需求

    • 定义若干个方法,只要加了MyTest注解,就可以在启动时被触发执行

    分析

    1. 定义一个自定义注解MyTest,只能注解方法,存活范围是一直都在
    2. 定义若干个方法,只要有@MyTest注解的方法就能在启动时被触发执行,没有这个注解的方法不能执行
    1. package com.csdn.d8_annotation;
    2. import java.lang.annotation.*;
    3. import java.lang.reflect.InvocationTargetException;
    4. import java.lang.reflect.Method;
    5. public class AnnotationDemo4 {
    6. @MyTest
    7. public void test1() {
    8. System.out.println("======test1======");
    9. }
    10. public void test2() {
    11. System.out.println("======test2======");
    12. }
    13. @MyTest
    14. public void test3() {
    15. System.out.println("======test3======");
    16. }
    17. /**
    18. * 启动菜单:有注解的才被调用。
    19. * @param args
    20. */
    21. public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
    22. AnnotationDemo4 t = new AnnotationDemo4();
    23. //a.获取类对象
    24. Class c = AnnotationDemo4.class;
    25. //b.提取全部方法
    26. Method[] method = c.getDeclaredMethods();
    27. //c.遍历方法,看是否有MyTest注解,有就跑它
    28. for (Method method1 : method) {
    29. if (method1.isAnnotationPresent(MyTest.class)) {
    30. method1.invoke(t);
    31. }
    32. }
    33. }
    34. }
    35. @Target({ElementType.METHOD, ElementType.FIELD})
    36. @Retention(RetentionPolicy.RUNTIME)
    37. @interface MyTest {
    38. }
    39. D:\Java\jdk-17\bin\java.exe
    40. ======test3======
    41. ======test1======

     简单的测试框架

    • 当主方法执行后,会自动自行被检测的所有方法(加了Check注解的方法),判断方法是否有异常,记录到文件中
    1. package com.csdn.annotation;
    2. import java.io.BufferedWriter;
    3. import java.io.FileWriter;
    4. import java.io.IOException;
    5. import java.lang.annotation.ElementType;
    6. import java.lang.annotation.Retention;
    7. import java.lang.annotation.RetentionPolicy;
    8. import java.lang.annotation.Target;
    9. import java.lang.reflect.Method;
    10. /**
    11. * 简单的测试框架
    12. */
    13. public class TestCheck {
    14. public static void main(String[] args) throws IOException {
    15. /*
    16. Calculator calculator = new Calculator();
    17. Class clazz = Calculator.class;
    18. Method[] m = clazz.getDeclaredMethods();
    19. for (Method method : m) {
    20. if (method.isAnnotationPresent(Check.class)) {
    21. method.invoke(calculator);
    22. }
    23. }
    24. */
    25. //1、创建计算器对象
    26. Calculator cal = new Calculator();
    27. //2、获取字节码文件对象
    28. Class clazz = Calculator.class;
    29. //3、获取所有方法
    30. Method[] me = clazz.getDeclaredMethods();
    31. int number = 0;//出现异常的次数
    32. BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));
    33. for (Method method : me) {
    34. //4、判断方法上是否有Check注解
    35. if (method.isAnnotationPresent(Check.class)) {
    36. try {
    37. method.invoke(cal);
    38. } catch (Exception e) {
    39. //6、捕获异常
    40. //记录到文件中
    41. number++;
    42. bw.write(method.getName() + " 方法出异常了");
    43. bw.newLine();
    44. bw.write("异常的名称:" + e.getCause().getClass().getSimpleName());
    45. bw.newLine();
    46. bw.write("异常的原因:"+e.getCause().getMessage());
    47. bw.newLine();
    48. bw.write("--------------------------");
    49. bw.newLine();
    50. }
    51. }
    52. }
    53. bw.write("本次测试一共出现" + number + "次异常");
    54. bw.flush();
    55. bw.close();
    56. }
    57. }
    58. /**
    59. * 小明定义的计算器类
    60. */
    61. class Calculator {
    62. @Check
    63. public void add() {
    64. String str = null;
    65. str.toString();
    66. System.out.println("1+0=" + (1 + 0));
    67. }
    68. @Check
    69. public void sub() {
    70. System.out.println("1-0=" + (1 - 0));
    71. }
    72. @Check
    73. public void mul() {
    74. System.out.println("1*0=" + (1 * 0));
    75. }
    76. @Check
    77. public void div() {
    78. System.out.println("1/0=" + (1 / 0));
    79. }
    80. public void show() {
    81. System.out.println("永无bug...");
    82. }
    83. }
    84. @Target(ElementType.METHOD)
    85. @Retention(RetentionPolicy.RUNTIME)
    86. @interface Check {
    87. }
    88. D:\Java\jdk-17\bin\java.exe
    89. 1-0=1
    90. 1*0=0

     

    小结

    1. 以后大多数时候,我们会使用注解,而不是自定义注解
    2. 注解的作用:第一个给编译器用,第二个给解析程序用
    3. 注解不是程序的一部分,可以理解为注解就是一个标签
  • 相关阅读:
    volatile的用途和说明
    面试官:请问如何提升TCP三次握手的性能?
    10分钟Apache Kylin快速入门
    这份Java面试全栈手册竟让我反败为胜
    GitHub Codespaces 安装 .NET 7
    eth ens 合约技术代码细节
    React中“WebSocket is closed before the connection is established“
    LeetCode 周赛上分之旅 #48 一道简单的树上动态规划问题
    深开鸿携手深业健康、家具协会打造智慧康养新模式,推动行业新标建设
    Android集成FlutterModule
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133978544