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

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

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


注解是开发框架的必备技术,也算是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);
          }
      }
  }
}
复制代码


3b0e5e0ea6da4547bc26ba02b5eb419c~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


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


4、总结


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

目录
相关文章
|
23天前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
86 43
Java学习十六—掌握注解:让编程更简单
|
18天前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
40 14
|
18天前
|
前端开发 Java
[Java]讲解@CallerSensitive注解
本文介绍了 `@CallerSensitive` 注解及其作用,通过 `Reflection.getCallerClass()` 方法返回调用方的 Class 对象。文章还详细解释了如何通过配置 VM Options 使自定义类被启动类加载器加载,以识别该注解。涉及的 VM Options 包括 `-Xbootclasspath`、`-Xbootclasspath/a` 和 `-Xbootclasspath/p`。最后,推荐了几篇关于 ClassLoader 的详细文章,供读者进一步学习。
28 12
|
11天前
|
Java 编译器
Java进阶之标准注解
Java进阶之标准注解
24 0
|
1月前
|
JSON Java 数据库
java 常用注解大全、注解笔记
关于Java常用注解的大全和笔记,涵盖了实体类、JSON处理、HTTP请求映射等多个方面的注解使用。
34 0
java 常用注解大全、注解笔记
|
2月前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
29天前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
16 0
|
2月前
|
Java 编译器 程序员
Java注解,元注解,自定义注解的使用
本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。
Java注解,元注解,自定义注解的使用
|
1月前
|
XML Java 数据格式
Java-spring注解的作用
Java-spring注解的作用
21 0
|
2月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit