使用IDE新建一个文件
添加四个注解
@Target
@Retention
@Inherited
@documented
public @interface Check {
}
@Target:
-
指示注释类型适用的上下文。
-
参数ElementType[]:
-
-
ANNOTATION_TYPE 注解类型声明
CONSTRUCTOR 构造函数声明
字段 字段声明(包括枚举常数)
LOCAL_VARIABLE 局部变量声明
METHOD 方法声明
PACKAGE 包装声明
PARAMETER 正式参数声明
TYPE 类,接口(包括注释类型)或枚举声明
TYPE_PARAMETER 键入参数声明
TYPE_USE 使用类型
-
-
指示要注释具有注释类型的注释的保留时间。 如果注释类型声明中没有保留注释,则保留策略默认为RetentionPolicy.CLASS 。
-
参数RetentionPolicy
-
-
CLASS 注释将由编译器记录在类文件中,但VM不需要在运行时保留。
RUNTIME 注释将由编译器记录在类文件中,并由VM在运行时保留,因此可以反射读取。
SOURCE 注释将被编译器丢弃
-
-
表示注释类型自动继承。
@documented
-
表示具有类型的注释默认情况下由javadoc和类似工具记录。
javadoc命令可以生成API文档
使用案例package annotation.demo;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@documented
public @interface Check {
}
package 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));
}
}
package annotation.demo;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.lang.reflect.Method;
public class TestCheck {
public static void main(String[] args) throws Exception {
// 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", true));
for (Method method : methods) {
// 4.判断是否有 Check注解
if (method.isAnnotationPresent(Check.class)) {
// 5.有则执行
try {
method.invoke(calculator);
// 6.捕获异常
} catch (Exception e) {
// 7. 记录到文件
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("第 " + (++number) + " 次异常,异常的方法: " + method.getName() + " 异常名称: "
+ e.getCause().getClass().getSimpleName() + " 异常信息: " + e.getCause().getMessage());
bufferedWriter.write(stringBuffer.toString());
bufferedWriter.newline();
}
}
}
bufferedWriter.flush();
bufferedWriter.close();
}
}
第 1 次异常,异常的方法: div 异常名称: ArithmeticException 异常信息: / by zero



