Java注解——简单的测试框架
1.概念描述:
2.作用分类
3.JDK:预定义注解:
@Override @Deprecated @SuppressWarning
4.自定义注解:
例如:
元注解
@Target @Retention @Documented @Inherited
5.在程序中使用(解析)注解
自定义注解使用案例
不用改代码即可任意对象和执行方法:
案例结构
自定义注解
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})//作用在类中
@Retention(RetentionPolicy.RUNTIME)//运行时起作用
public @interface li {
String className();
String methodName();
}
使用注解
package annotation;
import java.lang.reflect.Method;
@li(className = "annotation.lii", methodName = "show")
public class Annotation_Demo {
public static void main(String[] args) throws Exception {
//1.解析注释,获取该类的解码形式
Class<Annotation_Demo> annotation_demoClass = Annotation_Demo.class;
//2.上面的注解,其实就是生成一个接口该类的接口我们可以调用它的方法,茹上图所示
li l = annotation_demoClass.getAnnotation(li.class);
//3.调用注解注解中的方法,返回那些值
String className = l.className();
String methodName = l.methodName();
System.out.println(className+" "+methodName);
//加载该类井内存
Class cls1 = Class.forName(className);
//4创建对象
Object obj = cls1.newInstance();
//5.获取方法
Method method = cls1.getMethod(methodName);
//6.执行方法
method.invoke(obj);
}
}
类,方法
package annotation;
public class lii {
public void show() {
System.out.println("sleep.......");
}
}
6.简单的测试框架
1.项目结构
2.待测试类:
package TestCheck;
public class calculater{
@Check
public void add(){
String s =null;
s.toString();
System.out.println("1+1="+(1+1));
}
@Check
public void sub(){
System.out.println("1-1="+(1-1));
}
@Check
public void mul(){
System.out.println("1*1="+(1*1));
}
@Check
public void div(){
int a = 1/0;
System.out.println("1/0="+(1/0));
}
public void show(){
System.out.println("无异常-----------------");
}
}
3.自定义注解
package TestCheck;
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 {
}
4.测试方法
package TestCheck;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Method;
public class TestChect {
public static void main(String[] args) throws IOException {
// 1创建类名,待测试
calculater calculater = new calculater();
//2.获取字节码对象
Class cl = calculater.getClass();
//3.获取所有方法
int num=0;
Method[] methods = cl.getMethods();
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("bug.txt"));
for(Method method:methods){
//判断方法上是否有注解
if(method.isAnnotationPresent(Check.class)){
try {
method.invoke(calculater);
} catch (Exception e) {
num++;
bufferedWriter.write(method.getName()+"方法出问题");
bufferedWriter.newLine();
bufferedWriter.write("异常名称"+e.getCause().getClass().getSimpleName());
bufferedWriter.newLine();
bufferedWriter.write("异常原因"+e.getMessage());
bufferedWriter.newLine();
bufferedWriter.write("-----------------------");
bufferedWriter.newLine();
}
}
}
bufferedWriter.write("本次测试共出现"+num+"次异常");
bufferedWriter.flush();
bufferedWriter.close();
}
}
5.测试结果