一篇文章带你搞定JAVA注解

作者:香菜聊游戏 时间:2023-03-15 05:22:23 

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);
         }
     }
 }
}

一篇文章带你搞定JAVA注解

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

4、总结

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

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

来源:https://gamwatcher.blog.csdn.net/article/details/116278395

标签:JAVA,注解
0
投稿

猜你喜欢

  • 基于Scala和Java方法的相互调用

    2021-07-05 11:53:04
  • 详解Spring Cloud负载均衡重要组件Ribbon中重要类的用法

    2023-07-06 02:54:01
  • Android中ToggleButton开关状态按钮控件使用方法详解

    2022-11-10 06:24:35
  • java对象转型实例分析

    2021-12-19 14:14:15
  • C#图像处理之边缘检测(Smoothed)的方法

    2022-05-30 12:13:09
  • Mybatis注解增删改查的实例代码

    2022-03-31 01:26:15
  • C语言实现简单版三子棋

    2023-03-01 22:36:30
  • java图形界面编程之模拟血压计

    2023-10-01 07:16:05
  • 打造酷炫的AndroidStudio插件

    2021-07-27 03:06:42
  • Android viewpager中动态添加view并实现伪无限循环的方法

    2022-11-17 12:59:08
  • Java JVM内存区域详解

    2021-05-25 18:44:43
  • C#多线程系列之资源池限制

    2022-01-02 17:11:04
  • WeakHashMap 和 HashMap 区别及使用场景

    2022-06-25 02:16:15
  • Jmeter对接口测试入参实现MD5加密

    2023-08-19 08:59:05
  • C#实现简易多人聊天室

    2023-02-06 06:09:47
  • SpringBoot一个非常蛋疼的无法启动的问题解决

    2023-12-12 15:24:36
  • Java算法实现调整数组顺序使奇数位于偶数之前的讲解

    2022-01-23 22:41:19
  • C# Partial:分部方法和分部类代码实例

    2022-04-07 11:28:26
  • 详解JAVA类加载机制(推荐)

    2021-08-10 04:43:10
  • C#利用FileSystemWatcher实时监控文件的增加,修改,重命名和删除

    2021-08-21 05:46:28
  • asp之家 软件编程 m.aspxhome.com