欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java注解的学习笔记

程序员文章站 2024-02-16 09:35:04
...

一、概念

  • 注解是一种代码级别的说明,是JDK1.5以后引入的一个特性。
  • 它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明与注释。
  • 注解以@开头,比如 @Autowired,@Service,@Controller,@Override ,@Test,@Value 等等

二、分类

  • 注解按照来源划划分,可以分为
    1、JDK的注解。
    2、第三方的注解。
    3、自定义注解。

三、JDK的注解

3.1 JDK的注解可用来编写文档说明:

  • 通过代码里标识的注解可生成JavaDoc文档
/**
 * 使用注解使得程序注释可生成JavaDoc
 * 
 * @author zhuhuix
 * @date 2020-09-06
 * @version 1.0
 */
public class AnnotationDemo1 {

    /**
     * 两数之和
     * @param a 加数1
     * @param b 加数2
     * @return 返回两数相加之各
     */
    public int add(int a,int b){
        return a+b;
    }
}

Java注解的学习笔记

3.2 JDK的注解可进行编译检查

  • 通过代码里标识的注解让编译器能够实现基本的编译检查。
  • @Override : 检测被该注解标注的主法是否是继承自父类或者接口的。
  • @Deprecated:该注解标注的内容已过时。
  • @SuppressWarnings :压制警告。
/**
 * 使用注解让编译器进行编译检查
 *
 * @author zhuhuix
 */
public class AnnotationDemo2 {

    // 继承自父类
    @Override
    public String toString() {
        return super.toString();
    }
    
    // 过时
    @Deprecated 
    public int add(int a,int b){
        return a+b;
    }
    
    // 压制警告
    @SuppressWarnings("all")
    public int divide(int a,int b){
        return a/b;
    }
}

3.2 JDK中的元注解

  • @Target (注解的作用目标)
    Java注解的学习笔记

  • @Retention (注解的生命周期)
    Java注解的学习笔记

  • @Document (该注解标记的元素可以被Javadoc 或类似的工具文档化)

  • @Inherited (使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解)

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

四、第三方的注解

  • 比如Spring框架中用到了大量的注解
注解 作用
@SpringBootApplication 让spring boot自动给程序进行必要的配置
@Controller 用于定义控制器类
@RequestMapping 提供路由信息
@Import 用来导入其他配置类
@Autowired 自动导入依赖的bean

五、自定义注解

  • 首先我们需要了解注解的本质:其实就是一个接口,该接口默认继承Annotation接口
public  interface MyAnnotation extends java.lang.annotation.Annotation{
    
}
public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();
    
    Class<? extends Annotation> annotationType();
}
  • 自定义注解的格式:
/**
 * 元注解
 * 修饰符 @interface 注解名称 {
 * 属性声明A
 * 属性声明B
 * 属性声明...
 * }
 *
 * 修饰符:访问修饰符必须为public,不写默认为pubic;
 * 关键字:必须为@interface;
 *
 * 属性:注解中内容,可以理解成自定义接口的实现部分;
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
    /**
     *    注解的属性声明的两种形式
     *    type elementName();
     *    type elementName() default value;
     *    type[] elementName();
     */
    String value1() ;
    String value2() default "test";
    String[] value3();
}
  • 自定义注解的属性的返回值类型必须满足以下类型:
  1. 基本数据类型
  2. String类型
  3. 枚举类型
  4. 注解类型
  5. 以上类型的数组
  • 属性赋值必须满足以下条件:
  1. 使用自定义注解时,没有默认值的属性必须给属性赋值;
  2. 如果属性使用了default关键字赋予了默认值,则注解在使用时可以不进行赋值。
  3. 数组赋值时,需要用大括号进行包裹。
/**
 * 使用自定义注解,没有默认值的属性必须赋值
 */
@MyAnnotation(value1 = "111",value3 = {"a","b"})
public class AnnotationDemo3 {
    
  
}

六、注解案例

  • 自定义一个注解,用来标注代码检测
/**
 * 自定义代码检测注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCheck {
}

  • 编写一段源代码,用自定义注解进行标注
/**
 * 源代码--使用自定义注解进行标注
 */
public class Source {

    @MyCheck
    public int method1(){
        return 1+0;
    }

    @MyCheck
    public int method2(){
        return 1/0;
    }
    
}
  • 编写一个测试框架,进行异常检测
/**
 * 使用自定义代码检查注解检查代码中是否存在BUG
 */
public class SourceCheck {
    public static void main(String[] args) {

        Source source = new Source();
        Class clazz = source.getClass();
        Method[] methods = clazz.getMethods();
        for (Method method : methods){
            if (method.isAnnotationPresent(MyCheck.class)){
                try{
                    method.invoke(source);
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println(method.getName()+" 发生异常 :"+e.getCause().getMessage());
                }
            }
        }
    }
}

Java注解的学习笔记

七、总结

  • 在项目开发过程中,我们一般会使用注解(比如使用Spring框架的注解),而不是自定义注解。
  • 注解一般是给编译器或解析程序(比如上述案例中的代码检测框架)用。
  • 注解不是程序的一部分,可以理解为注解就是一个标签。
相关标签: java annotations

上一篇: Annotation详解

下一篇: