目录
一、自定义注解
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 {
@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.注解不是程序的一部分,可以理解为注解就是一个标签
相关文章
暂无评论...