Annotation注解的应用(打印异常信息):
1.创建一个检索注解(CheckException):
1 package demo4; 2 3 import java.lang.annotation.*; 4 5 //?什么是元注解? 注解的父类 注解的注解 元注解 6 7 /** 8 * 在IDEA/eclipse中,当你按下Ctrl+s 相当于执行了javac CheckException.java 9 */ 10 @Target(ElementType.METHOD)//该注解可以作用在方法上 11 @Retention(RetentionPolicy.RUNTIME)// (源码) .class 运行时 12 @Documented //文档注解 13 public @interface CheckException { 14 }
2.创建一个计算机类(Calculator):
1 package demo4; 2 3 /** 4 * 计算器类 5 */ 6 7 public class Calculator { 8 /** 9 * 写代码,先写好伪代码[逻辑思维],然后翻译成java编程语句 10 */ 11 //加 add + 12 @CheckException 13 public void add(){ 14 System.out.println("1+0="+(1+0)); 15 } 16 //减 sub - 17 @CheckException 18 public void sub(){ 19 System.out.println("1-0="+(1-0)); 20 } 21 //乘 mul * 22 @CheckException 23 public void mul(){ 24 System.out.println("1*0="+(1*0)); 25 } 26 //除 div / 27 @CheckException 28 public void div(){ 29 System.out.println("1/0="+(1/0)); 30 } 31 32 }
3.写一个TestCheckException (用于打印异常信息):
1 package demo4; 2 3 import java.io.BufferedWriter; 4 import java.io.FileWriter; 5 import java.io.IOException; 6 import java.lang.reflect.InvocationTargetException; 7 import java.lang.reflect.Method; 8 9 /** 10 * 1.整理思路 11 * 1.测试@CheckExcetion注解是否生效 测试已生效 12 * 2.若包含@CheckException注解,则该方法执行 13 * 3.若执行有异常,则记录异常信息在bug.txt文档中 14 * 2.写伪代码(写注释) 15 * 1)main 选main 16 * 2)测试方法 @Test 17 * 3.翻译成java代码 18 * 19 */ 20 public class TestCheckException { 21 public static void main(String[] args) { 22 //2.若包含@CheckException注解,则该方法执行-->反射技术 23 Caculator caculator=new Calculator(); 24 //请问获取Class类对象的几种方式: forName .class .getClass .getSystemClassLoader.getLClass() 25 Class caculatorClazz=null; 26 int num=0; 27 //定义我的文件输出流 28 BufferedWriter bufferedWriter=null; 29 try { 30 caculatorClazz= ClassLoader.getSystemClassLoader().loadClass("demo4.Calculator"); 31 //获取方法 32 Method[] methods=caculatorClazz.getMethods(); 33 //若包含@CheckException注解 34 //增强for循环 35 //定义错误数量 36 37 try { 38 bufferedWriter = new BufferedWriter(new FileWriter("checkException.txt")); 39 40 } catch (IOException e) { 41 e.printStackTrace(); 42 } 43 for (Method method:methods) { 44 //判断该方法.是否预处理注解,注解类型为:CheckException.class 45 if (method.isAnnotationPresent(CheckException.class)){ 46 //若包含该注解,则调用(执行)该方法 47 try { 48 method.invoke(caculator); 49 } catch (Exception e) { 50 num++; 51 /** 52 * method方法有异常:div ==>记录异常信息所在的方法 bug.txt 53 * 异常类型:java.lang.ArithmeticException==>打印异常类型 54 * 异常信息:/ by zero ==>导致异常的原因 55 * ------------------------ ==>分割符 56 * 共计异常数量:1 ==>统计异常数量 57 */ 58 try { 59 bufferedWriter.write("****************"); 60 bufferedWriter.newLine(); 61 bufferedWriter.write("异常所在的方法:"+method.getName()); 62 bufferedWriter.newLine(); 63 bufferedWriter.write("异常名称:"+e.getCause().getClass().getName()); 64 bufferedWriter.newLine(); 65 bufferedWriter.write("异常原因:"+e.getCause().getMessage()); 66 bufferedWriter.newLine(); 67 System.out.println("程序消息打印成功!"); 68 69 70 } catch (IOException e1) { 71 e1.printStackTrace(); 72 } 73 } 74 } 75 } 76 } catch (ClassNotFoundException e) { 77 e.printStackTrace(); 78 } 79 try { 80 bufferedWriter.write("***************"); 81 bufferedWriter.newLine(); 82 bufferedWriter.write("异常总数:"+num); 83 bufferedWriter.flush(); 84 bufferedWriter.close(); 85 } catch (IOException e) { 86 e.printStackTrace(); 87 } 88 89 } 90 }
运行效果图:
心得总结:
贵有恒何必三更眠五更起,最无益只怕一日曝十日寒。
demo4