注解_解析注解与注解_案例_简单的测试框架
注解_解析注解
在程序使用(解析)注解:获取注解中定义的属性值
1.获取注解定义的位置的对象(Class,Method,Field)
2.获取指定的注解
getAnnotation(class)
// 其实就是在内存中生成了一个该注解的子类实现对象 public class ProImpl implements Pro{ public String className( ){ return "cn.itcast.annotation . Demo1"; } public string methodName( ){ return "show" ; } }
3.调用注解中的抽象方法获取配置的属性值
package day01.Demo01_Day017.JiaoXiao; 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 Pro { String className(); String methodName(); }
package day01.Demo01_Day017.JiaoXiao; public class Demo01 { public void show(){ System.out.println("demo1...show..."); } }
package day01.Demo01_Day017.JiaoXiao; import java.lang.reflect.Method; /* 框架类 */ @Pro(className = "day01.Demo01_Day017.JiaoXiao.Demo01",methodName = "show") public class ReflectTest { public static void main(String[] args) throws Exception { /* 前提不能改变该类的任何代码。可以创建任意类的对象,可以执行任意方法 */ //解析注解 //1.1获取该类的字节码文件对象 Class<ReflectTest> aClass = ReflectTest.class; //2.获取上边的注解对象 // 其实就是在内存中生成了一个该注解的子类实现对象 /* public class ProImpl implements Pro{ public String className( ){ return "cn.itcast.annotation . Demo1"; } public string methodName( ){ return "show" ; } } */ Pro pro = aClass.getAnnotation(Pro.class); //3.调用注解对象中定义的抽象方法,获取返回值 String className = pro.className(); String methodName = pro.methodName(); System.out.println(className); System.out.println(methodName); //3.加载该类进内存 Class aClass1 = Class.forName(className); //4.创建对象 Object o = aClass1.newInstance(); //5.获取方法对象 Method method = aClass1.getMethod(methodName); //6.执行方法 method.invoke(o); } }
注解_案例_简单的测试框架
package day01.Demo01_Day017.Windows; /* 计算机类 */ 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="+(1*0)); } //除法 @Check public void div(){ System.out.println("1/0="+(1/0)); } public void show(){ System.out.println("永无bug....."); } }
package day01.Demo01_Day017.Windows; 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 { }
package day01.Demo01_Day017.Windows; 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 cls = c.getClass(); //3.获取文件 Method[] methods = cls.getMethods(); int number = 0; //出现异常的次数 BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt")); for (Method method : methods) { //4.判断方法上是否有Check注解 if (method.isAnnotationPresent(Check.class)){ //5.有,执行 try { method.invoke(c); } catch (Exception e) { //6.捕获异常 //记录到文件夹中 number++; bw.write(method.getName() + "方法出现异常"); bw.newLine(); bw.write("异常的名称:" + e.getCause().getClass().getSimpleName()); bw.newLine(); bw.write("异常的原因:" + e.getCause().getMessage()); bw.newLine(); bw.write("---------------------------------"); } } } bw.write("本次测试一共出现了" + number + "次异常"); bw.flush(); bw.close(); } }
小结:
1. 以后大多数时候,我们会使用注解,而不是自定义注解
2. 注解给谁用?
1. 编译器
2. 给解析程序用
3. 注解不是程序的一部分,可以理解为注解就是一个标签