目录
一、自定义注解
1.自定义注解源代码
package cn.test; 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 { }
2.元注解
自定义注解@Check
在自定义中用到了
@Retention(RetentionPolicy.RUNTIME) 该注解是表示用到该注解的注解的作用阶段
样例注解是: 是保存到字节码文件且被JVM读取到。
@Target({ElementType.METHOD}) 该注解是表示用到该注解的注解的作用类型
样例注解是: 是表面该注解的注解是作用在方法上的。
二、定义实用类
1.实用类源代码
package cn; import cn.test.Check; 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="+(0*1)); } @Check public void div() { System.out.println("1/0="+(1/0)); } public void show() { System.out.println("无bug........."); } }
给加减乘除四个方法加上了@Check注解(进行编译检查)
三、解析注解
1.解析步骤
(1)
创建对象
Calculator c=new Calculator();
(2)
获取字节码文件对象
Class<? extends Calculator> aClass = c.getClass();
(3)
获取所有方法
Method[] methods = aClass.getMethods();
(4)
判断方法上是否有Check注解
要判断 肯定要遍历
定义变量 --出现次数
定义IO流 把异常写入文档
2.解析注解源代码
package cn.test; import cn.Calculator; 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 c=new Calculator(); //2.获取字节码文件对象 Class<? extends Calculator> aClass = c.getClass(); //3.获取所有方法 Method[] methods = aClass.getMethods(); //4.判断方法上是否有Check注解 //要判断 肯定要遍历 int number=0; //出现异常的次数 BufferedWriter bw=new BufferedWriter(new FileWriter("bug.txt")); for (Method method:methods) { //isAnnotationPresent 方法 判断当前方法 method 对象 有没有指定的注解被加上了 被作用了 if (method.isAnnotationPresent(Check.class)) { //5.有,执行 // 6.捕获异常 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("本次一个出现"+number+"次异常"); bw.flush(); bw.close(); } }
3.测试结果:
四、注解小结
1.以后大多数时候,我们会使用注解,而不是自定义注解
2.注解给谁看:
(1)编译器
(2)给解析程序使用
3.注解不是程序的一部分,可以理解为注解就是一个标签