目录

一、自定义注解

1.自定义注解源代码

2.元注解

二、定义实用类

1.实用类源代码

三、解析注解

1.解析步骤

2.解析注解源代码

3.测试结果:

四、注解小结


一、自定义注解

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 {@Checkpublic void add(){System.out.println("1+0="+(1+0));}@Checkpublic void sub(){System.out.println("1-0="+(1-0));}@Checkpublic void mul(){System.out.println("1*0="+(0*1));}@Checkpublic 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 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 aClass = c.getClass();//3.获取所有方法Method[] methods = aClass.getMethods();//4.判断方法上是否有Check注解//要判断肯定要遍历intnumber=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.注解不是程序的一部分,可以理解为注解就是一个标签