当前位置:
首页
文章
后端
详情

带你深入了解Java中的注解以及常用注解的使用

说起注解,相信很多小伙伴都会联想到注释,但这两个东西就像是名字很像是兄弟却不是兄弟的。注释相信大家都很熟悉了,但是注解知之甚少。下面,我将和大家分享一篇关于Java注解知识详解的文章,一起来学习一下吧!

    一、注解是什么

    Java 注解用于为 Java 代码提供元数据,看完这句话也许你还是一脸懵逼,用人话说就是注解不直接影响你的代码执行,仅提供信息。接下我将从注解的定义、元注解、注解属性、自定义注解、注解解析JDK 提供的注解这几个方面再次了解注解(Annotation)

    二、jdk支持的注解有哪些

    2.1 三种常用的注解:

    @SuppressWarnings     该注解的作用是阻止编译器发出某些警告信息。它可以有以下参数:  

    deprecation :过时的类或方法警告。    
    unchecked:执行了未检查的转换时警告。    
    allthrough:当Switch程序块直接通往下一种情况而没有Break时的警告。    
    path:在类路径、源文件路径等中有不存在的路径时的警告。        
    serial:当在可序列化的类上缺少serialVersionUID定义时的警告。     
    finally:任何finally子句不能完成时的警告。       
    all:关于以上所有情况的警告
    

    @Deprecated       该注解的作用是标记某个过时的类或方法。

    @Override     该注解用在方法前面,用来标识该方法是重写父类的某个方法。

    2.2 元注解

    元注解主要是用来注解自定义注解的注解,分别有@Retention、 @Target、 @Document、 @Inherited和@Repeatable(JDK1.8加入)五种。

    下面讲两个平常最常用的注解:

    @Retention 注解的生命周期,主要有

    RetentionPolicy.SOURCE 仅存在于源码中
     
    RetentionPolicy.CLASS 默认的策略,在class字节码文件中存在,但运行时无法获得
     
    RetentionPolicy.RUNTIME 在运行时可以通过反射获取到,也是最常用的。

    @Target 注解的作用目标,主要有

     ElementType.TYPE  作用接口、类、枚举、注解
     
     ElementType.FIELD 作用属性字段、枚举的常量
     
     ElementType.METHOD 作用方法
     
     ElementType.PARAMETER 作用方法参数
     
     ElementType.CONSTRUCTOR 作用构造函数
     
     ElementType.LOCAL_VARIABLE 作用局部变量
     
     ElementType.ANNOTATION_TYPE 作用于注解(@Retention注解中就使用该属性)
     
     ElementType.PACKAGE 作用于包
     
     ElementType.TYPE_PARAMETER 作用于类型泛型,即泛型方法、泛型类、泛型接口 (jdk1.8加入)
    

    三、注解实例

    在枚举中编译器只会限制枚举的名字不能重复,在开发中经常会遇到枚举Id 重复的问题,因为每个人在开发功能的时候一般只会专注于自己的功能,做完只会直接提交代码,不会注意到枚举Id冲突,这个时候可以使用下面的代码进行枚举自检,在项目的开发阶段就能及时发现代码的问题。下面的代码稍微修改下就可以在项目中使用,拿走不写。

    1、自定义注解

    检测枚举的key 是否有重复

    package org.pdool.anno;
     
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    /**
    * @author 香菜
    */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface CheckEnum {
    }
    

    2、在对应的方法上增加注解

    package org.pdool.anno;
    /**
    * 资源枚举类
    * @author 香菜
    */
    public enum ResType {
       GOLD(1),
       DIAMOND(2),
       //注意:此处重复
       SILVER(2);
       int type;
     
       @CheckEnum
       public int getType() {
           return type;
      }
     
       ResType(int type) {
           this.type = type;
      }
    }
    

    3、在项目启动的时候检查注解的枚举

    package org.pdool.anno;
     
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.HashSet;
    import java.util.Set;
     
    /**
    * @author 香菜
    */
    public class Aain {
       public static void main(String[] args) throws InvocationTargetException,IllegalAccessException {
           // 获取有注解的方法
           Method[] declaredMethods = ResType.class.getDeclaredMethods();
           Method annoMethod = null;
           for (Method declaredMethod : declaredMethods) {
               CheckEnum  annotation = declaredMethod.getAnnotation(CheckEnum.class);
               if (annotation != null){
                   annoMethod = declaredMethod;
                  break;
              }
          }
           Set<Object> set = new HashSet<>();
           // 遍历每个枚举的id
           Object[] oo = ResType.class.getEnumConstants();
           for (Object o : oo) {
               Object invoke = annoMethod.invoke(o);
               if (!set.contains(invoke)){
                   set.add(invoke);
              }else {
                   System.out.println("重复的key "+ o +" -- "+ invoke);
              }
          }
      }
    }
    

    2021050714471269

    注:上面的代码只是简单的实例,只是为了展示核心代码,在项目中使用时可以修改类的获取为扫描项目下的包,遍历所有的枚举,就可以在项目中使用了。

    四、总结

    注解虽然不影响代码的运行,但是可以为运行中的程序提供更多的信息,注解也是很多框架的基本技术切入点,比如Spring 的注解,Lombok 的各种注解,都是使用了注解做了很多事,明白了注解是怎么回事,理解框架也会轻而易举。

    关于Java注解的内容以及使用方法的文章就介绍到此结束了,如果您觉得本篇文章还不错,对学习或是工作由所帮助,还希望大家能够多多支持W3Cschool!


    免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

    同类热门文章

    深入了解C++中的new操作符:使用具体实例学习

    C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。

    
深入了解C++中的new操作符:使用具体实例学习

    怎么用Java反射获取包下所有类? 详细代码实例操作

    Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。

    
怎么用Java反射获取包下所有类? 详细代码实例操作

    了解Java中的volati关键字的作用 以及具体使用方法

    本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。

    
了解Java中的volati关键字的作用 以及具体使用方法

    Java Map 所有的值转为String类型

    可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

    Java Map 所有的值转为String类型

    员工线上学习考试系统

    有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

    员工线上学习考试系统