注解Annotation-反射的伙伴
2020-04-02 07:52
543 查看
注解(Annotation):
- 概念:说明程序的。给计算机看的。
- 注释:用文字描述程序的。给程序员看的。
- 定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数的前面,用来对这些元素进行说明,注释。
- 概念描述: JDK1.5之后的新特性
- 说明程序的
- 使用注解:@注解名称
-
编写文档:通过代码里标识的注解生成文档[生成文档doc文档]。
-
@Override:检测被该注解标注的方法是否是继承自该父类(接口)的
-
格式:
元注解
-
public interface MyAnno extends java.lang.annotation.Annotation{}
-
要求:
-
属性的返回值类型有下列取值,其他的都不行
String
-
@Target:描述注解能够作用的位置
ElementType取值:
TYPE:可以作用于类上
-
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
-
获取定义的位置的对象
-
getAnnotation(class)
package cn.itcast.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 pro { String className(); String methodName(); }
package cn.itcast.annotation; public class DemoClass { public void show(){ System.out.println("DemoClass...show...."); } }
package cn.itcast.annotation; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Properties; /** * 框架类 */ @pro(className = "cn.itcast.annotation.DemoClass",methodName = "show") public class ReflectTest { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //1.解析注解 //1.1获取该类的字节码文件对象 Class<ReflectTest> reflectTestClass = ReflectTest.class; //2.获取上面的注解对象 pro an = reflectTestClass.getAnnotation(pro.class); //3.调用注解中的抽象方法,获取返回值 //其实就是在内存中生成了一个该注解接口的子类实现对象 /* public class ProImplement implement pro{ public String className(){ return "cn.itcast.annotation.DemoClass"; } public String methodName(){ return "show"; } */ String className = an.className(); String methodName = an.methodName(); System.out.println(className); System.out.println(methodName); //3.加载该类进内存 Class cls = Class.forName(className); //4.创建对象 //Object obj = cls.newInstance();java9之后该方法不能用 Constructor constructor = cls.getDeclaredConstructor(); Object obj = constructor.newInstance(); //5.获取方法对象 Method method = cls.getMethod(methodName); //6.执行方法 method.invoke(obj); } }
- 练习:一次测试编写的所有方法
package cn.itcast.annotation.demo; 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("never to see bug..."); } }
package cn.itcast.annotation.demo; 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 cn.itcast.annotation.demo; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /* 1.简单的测试框架 2.实现自动检测所有的测试方法,判断方法是否正常执行,记录到文件中 */ 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)){ //有注解就执行 try { method.invoke(c); } catch (Exception e) { //5.捕获异常,记录到文件中 number++; bw.write(method.getName()+"方法出现异常le"); bw.newLine(); bw.write("异常的名称"+e.getCause().getClass().getSimpleName()); bw.newLine(); bw.write("异常的原因"+e.getCause().getMessage()); bw.newLine(); bw.write("--------------------------"); bw.newLine(); } } } bw.write("本次测试一共出现"+number+"次异常。"); bw.flush(); bw.close(); } }
- 编译结果:生成bug.txt文件。
div方法出现异常le 异常的名称ArithmeticException 异常的原因/ by zero -------------------------- 本次测试一共出现1次异常。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- java 注解annotation的使用以及反射如何获取注解
- java 注解annotation的使用,以及反射如何获取注解
- Java注解(Annotation)详解(四)——注解反射生成SQL语句
- JAVA 与 MyCat(5) 类的加载 Java内省/反射机制 注解Annotation 详解
- 实现基于注解(Annotation)的数据库框架(四)注解(Annotation)和反射的结合使用
- Java反射API研究(1)——注解Annotation
- 使用反射来提取注解annotation
- java 注解annotation的使用,以及反射如何获取注解
- 通俗讲解Annotation注解(反射注解)
- 实现基于注解(Annotation)的数据库框架(一)反射的基本了解
- java 注解annotation的使用,以及反射如何获取注解
- 深入理解Java:注解(Annotation)--注解处理器(反射机制)
- 简单自定义Annotation和利用反射获取注解中的值
- Java反射reflection与注解annotation的应用(自动测试机)
- 实现基于注解(Annotation)的数据库框架(六)亲自验证反射的效率及解决办法
- java 自定义注解annotation和通过反射获取注解
- 通过反射获取注解(Annotation)
- 注解_Annotation_内置注解_自定义注解_反射机制读取注解JAVA208-210
- 利用反射自定义注解Annotation
- Java注解(Annotation)详解(四)——注解反射生成SQL语句