package com.javaWeb04;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 利用注解作为一个标签,写一个测试框架,用来测试一个类中的方法是否存在bug
*/
/**
* 总结:
* 1、以后大多数情况,我们会使用注解,而不是自定义注解
* 2、注解给谁用?
* 1)编译器:识别注解,检测编译是否有问题
* 2)给解析程序用:例如Test.java就是解析程序,如果没有这个解析程序的存在,那么在方法上加的
* 注解将是毫无意义
* 3、注解不是程序的一部分,可以理解为注解就是一个标签
*
*/
public class Test {
public static void main(String[] args) throws Exception {
//创建一个对象
Calculator c=new Calculator();
//创建class对象
Class cClass = c.getClass();
//获取方法
Method[] methods = cClass.getMethods();
//定义异常次数
int number=0;
//定义
BufferedWriter bw=new BufferedWriter(new FileWriter("bug.txt"));
for (Method method : methods) {
//判断方法里面是否有注解
if(method.isAnnotationPresent(Check.class)){//获取了calculator的class对象,
//通过此对象获取methods,判断是否有注解也应该是字节码文件
try {
method.invoke(c);
} catch (Exception e) {
number++;
bw.write(method.getName()+"方法出现异常");
bw.newLine();
bw.write("异常名称:"+e.getCause().getClass().getSimpleName());//获取字节码文件再获取它的简短类名不带包名
bw.newLine();
bw.write("异常原因:"+e.getCause().getMessage());
bw.newLine();
bw.write("-------------------");
bw.newLine();//换行
}
}
}
bw.write("异常次数为"+number);
bw.flush();//刷新一下
bw.close();
}
}
package com.javaWeb04;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Check {
}
package com.javaWeb04;
public class Calculator {
@Check
public void add() {
String s = null;
s.toString();
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...");
}
}
add方法出现异常
异常名称:NullPointerException
异常原因:null
-------------------
div方法出现异常
异常名称:ArithmeticException
异常原因:/ by zero
-------------------
异常次数为2