注解

概念:和注释一样,都是解释说明程序。但注解是给计算机看的。不改变原有的逻辑,JVM在编译或运行期读取注解,根据不同的注解类型做相应的处理。

定义:注解(Annotation)/元数据。一种代码级别的说明。JDK1.5后引入可声明在包、类、字段、方法、局部变量、方法参数等的前面,对元素进行说明,注释。

本质:注解本质上就是一个接口,默认继承Annotation接口(lang包下)

使用注解:@注解名称

作用

  • ①编写文档:生成文档doc文档

  • ②代码分析:对代码进行分析【使用反射】

  • ③编译检查:编译器能实现基本的编译检查【Override】

常用注解:@Override :重写;@Deprecated:表示已过时;@SuppressWarnings:压制警告。一般传递参数all【@SuppressWarnings("all")】

自定义注解

格式:

元注解
public @interface 注解名称{
    属性列表;
}

属性:接口中的抽象方法。返回值类型【基本数据类型、String、枚举、 注解以及它们的数组】

要求:

  • 1.定义属性,使用时需给属性赋值。

  • 2.如用default关键字给属性默认初始化值,使用注解时可以不进行属性的赋值。

  • 3.如只有一个属性需要赋值且属性名称是value,则value可以省略。

  • 4.数组赋值时用{}包裹。数组只有一个值可省略{}。

示例

package com.sire.source.jdknew.annotation;
/*注解演示*/
// 定义注解
@interface MyAnno1 {
    /*属性:基本数据 字符串 注解 枚举以及它们的数组*/
    int intVal();
    String strVal() default "sire";// 加上默认值在使用注解的时候可以不用复制
   /* MyAnn anVal();
    Sire enuVal();*/
    int[] arrVal();
    int value();
}
@interface MyAnn {}
enum Sire{
    aa;
}
// 使用注解
/*@MyAnno1(intVal = 23,arrVal = 34)*/
@MyAnno1(intVal = 23,arrVal = {2,6},value= 45)
public class MyAnno {}

元注解

概述:用于描述注解的注解

@Target:注解能够作用的位置。ElementType取值:TYPE:作用于类;METHOD:作用于方法;FIELD:作用于成员变量
@Retention:注解被保留的阶段。@Retention(RetentionPolicy.RUNTIME):当前描述的注解,class字节码文件会保留,并被JVM读取。
@Documented:api文档是否会抽取到注解。
@Inherited:描述注解是否被子类继承

示例

package com.sire.source.jdknew.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

/*演示元注解*/
@Target(ElementType.METHOD)
@interface Anno2{
    int value();
}
/*@Anno2(23) 报错,只能允许在方法上*/
public class TestAnno2 {
    @Anno2(23)
    public void run(){}
}

综合案例

概述:在类上加自定义注解并写一个测试类进行测试

自定义注解

package com.sire.source.jdknew.annotation;

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 com.sire.source.jdknew.annotation;
/*计算器*/
public class Calc {
    @check
    public void add(){
        System.out.println(Integer.parseInt("a"));
        System.out.println("1+0="+(1+0));
    }
    @check
    public void sub(){
        System.out.println("1-0="+(1-0));
    }
    @check
    public void mut(){
        System.out.println("1*0="+(1*0));

    }@check
    public void del(){
        System.out.println("1/0="+(1/0));
    }

}

测试类

package com.sire.source.jdknew.annotation;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Method;

/*测试方法*/
public class TestCalc {
    public static void main(String[] args) throws Exception {
        Calc c = new Calc();
        // 1.获取对象
        Class<Calc> clazz = (Class<Calc>) c.getClass();
        // 2.获取所有方法
        Method[] methods = clazz.getMethods();
        int num = 0;// 异常出现次数
        // 异常保存
        BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
        // 3.循环所有方法
        for(Method method:methods){
            if(method.isAnnotationPresent(check.class)){
                try {
                    // 4.唤醒方法
                    method.invoke(c);
                } catch (Exception e) {
                    num++;
                    // 保存异常信息
                    bw.write("第"+num+"次异常");
                    bw.newLine();
                    bw.write("出现异常的方法:"+method.getName());
                    bw.newLine();
                    bw.write("异常名称:"+e.getCause().getClass().getName());
                    bw.newLine();
                    bw.write("异常信息:"+e.getCause().getMessage());
                    bw.newLine();
                }
            }
        }
        bw.write("---------------------------------------\n");
        bw.write("总共发生了"+num+"次异常");
        // 6.刷新关闭
        bw.flush();
        bw.close();
    }
}

效果

控制台

文本文件内容

Last updated

Was this helpful?