飞道的博客

注解

374人阅读  评论(0)

注解

概念

JDK1.5之后的新特性

说明程序的,给计算机看的

作用分类

编写文档:

通过代码里标识的元数据生成文档(生成doc文档)

package annotation;

/**
 * @author 闻人醉
 * @since 1.5
 * @version 1.0
 */
public class AnnoDemo1 {
    /**
     * 计算两数的和
     * @param a 参数
     * @param b 参数
     * @return  返回值
     */
    public int add(int a,int b){
        return a+b;
    }
}


在命令窗口通过 javadoc AnnDemo1.java  可生成doc文档
    出现  编码 GBK 的不可映射字符 (0x9C)
    javadoc -encoding UTF-8 文件名.java   即可

代码分析:

通过代码里标识的元数据对代码进行分析(使用反射)

编译检查:

通过代码里标识的元数据让编译器能够实现基本的编译检查(Override)

JDK中预定义的一些注解

@Override:检测被该注解标注的方法是否是继承自父类(接口)的

@Deprecated:该注解标注的内容,表示已过时

@SuppressWarnings("all"):压制所有的编译器警告

自定义注解

/*格式 其本质就是一个接口*/
元注解
public @interface 注解名称{}
属性

接口中的抽象方法

要求
1.属性的返回值类型
​	基本数据类型
​	String
​	枚举(enum)
​	以上类型的数组

2.定义了属性,在使用时需要给属性赋值
​	如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不给属性赋值

​	数组赋值时如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值就可以

元注解

用于描述注解的注解

1. @Target:描述注解能够作用的位置
   ElementType取值:
   ​	.TYPE:可以作用于类上
   ​	.METHOD:可以作用于方法上
   ​	.FIELD:可以作用于成员变量上
   
2. @Retention:描述注解被保留的阶段
   ​RetentionPolicy.RUNTIME:被描述的注解会保留到class字节码文件中,并被JVM读取到

3. @Documented:描述注解被抽取到api文档中

4. @Inherited:描述注解被子类继承
在程序中使用注解

获取注解中定义的属性值

//1.解析注解
//1.1获取该类的字节码文件
Class<ReflectTest> reflectTestClass = ReflectTest.class;
//2.获取上边的注解对象
//其实就是在内存中生成了一个该注解接口的子类实现对象
Pro annotation = reflectTestClass.getAnnotation(Pro.class);
//3.调用注解对象中定义的抽象方法,获取返回值
String className = annotation.className();
String methodName = annotation.methodName();
System.out.println(className);
System.out.println(methodName);

案例

/**
 * @author 闻人醉
 * 简单的测试框架
 *
 * 当主方法执行后,会自动检测被Check注解的所有方法,判断是否有异常,记录到文件中
 */
public class TestCheck {
    public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException {
        //1.创建计算器对象
        Calculator c = new Calculator();
        //2.获取字节码文件对象
        Class<? extends Calculator> aClass = c.getClass();
        //3.获取所有方法
        Method[] methods = aClass.getMethods();

        //出现异常的次数
        int number = 0;
        BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));

        for (Method method : methods) {
            //4.判断方法上是否有Check注解
            if (method.isAnnotationPresent(Check.class)){
                //5.有,执行
                Object o = aClass.newInstance();
                try {
                    method.invoke(o);
                } 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.write("----------");
        bw.flush();
        bw.close();

    }
}


转载:https://blog.csdn.net/kiligzzz/article/details/105920471
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场