当前位置 博文首页 > 香菜:Java 注解说的明明白白,清清楚楚,记得点赞关注

    香菜:Java 注解说的明明白白,清清楚楚,记得点赞关注

    作者:[db:作者] 时间:2021-07-17 09:41

    图片

    目录

    1、注解是什么

    2、jdk支持的注解有哪些

    2.1 三种常用的注解:

    2.2 元注解

    3、注解实例

    1、自定义注解

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

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

    4、总结


    ?

    准备五一后辞职了,公司也没有很多开发任务,基本上不需要加班了,每天下班之后打会球就回来了,有不少的时间可以用来做自己想做的事,真的开心。

    注解是开发框架的必备技术,也算是Java中相对高级的技术,不知道为什么一直没有想起来写,今天写一下,让我们开始吧。

    1、注解是什么

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

    2、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加入)

    3、注解实例

    在枚举中编译器只会限制枚举的名字不能重复,在开发中经常会遇到枚举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);
    ? ? ? ? ? }
    ? ? ? }
    ? }
    }

    图片

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

    4、总结

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

    有疑问的可以留言,我们一起讨论,没有问题的也可以留言,我们交个朋友

    打字不容易,点赞,转发,关注三连,谢谢大家

    cs