目录
一、自定义注解
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.注解不是程序的一部分,可以理解为注解就是一个标签
转载:https://blog.csdn.net/m0_61469860/article/details/125691124
查看评论