千家信息网

如何理解Java注解

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"如何理解Java注解"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!由@Autowir
千家信息网最后更新 2026年11月02日如何理解Java注解

本篇内容介绍了"如何理解Java注解"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

由@Autowired引发对注解的思考

我们在编写Spring应用时,会发现通过@Autowired来对成员变量、方法和构造函数进行标注进而实现自动装配的工作,在IDE中点击@Autowired 看其源码会发现里面有更多以@开头的东东,这就是我们今天讲解的重点——Java注解!

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Autowired {     /**      * Declares whether the annotated dependency is required.      * 

Defaults to {@code true}. */ boolean required() default true; }

Java 注解详解

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Annotation 是一个辅助类,它在 Junit、Struts、Spring 等工具框架中被广泛使用。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。当然它也支持自定义Java 标注。

Java 定义了一套内置注解,包括:

@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。

@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。

@SuppressWarnings - 指示编译器去忽略注解中声明的警告。

作用在其他注解的注解(或者说 元注解)是:

@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。

1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;

2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;

3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;

@Documented - 标记这些注解是否包含在用户文档中。

@Target - 标记这个注解的作用目标是哪种 Java 成员。

@Target(ElementType.TYPE)——接口、类、枚举、注解

@Target(ElementType.FIELD)——字段、枚举的常量

@Target(ElementType.METHOD)——方法

@Target(ElementType.PARAMETER)——方法参数

@Target(ElementType.CONSTRUCTOR) ——构造函数

@Target(ElementType.LOCAL_VARIABLE)——局部变量

@Target(ElementType.ANNOTATION_TYPE)——注解

@Target(ElementType.PACKAGE)——包

@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

从 Java 7 开始,额外添加了 3 个注解:

@SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。

@FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。

@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

自定义注解开发

接下来,我们来学习如何进行自定义注解的开发。

使用@interface方式定义一个注解

import  java.lang.annotation.Retention; import  java.lang.annotation.Target; import  java.lang.annotation.ElementType; import  java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyTag{   String name(); //注解中定义变量name }

写一个类,在方法中应用@MyTag

public class TestTag {      @MyTag(name="case1")      public void login(){          System.out.println("login");      }      @MyTag(name="case2")      public void info(){          System.out.println("info");      }      @MyTag(name="case3")      public void logout(){          System.out.println("logout");      } }

写一个测试类,获取TestTag 类login方法中的@MyTag中的name值。前面我们说了很多注解如何定义,放在哪,现在我们可以开始学习注解属性的提取了,这才是使用注解的关键,获取属性的值才是使用注解的目的。获取注解属性, 需要使用反射技术(我会在下面的文章中重点介绍反射),代码如下:

public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException {         //装载类并且对其进行实例化的操作。       Class tag = Class.forName("com.my.demo.TestTag");         //调用login方法(必须是public类型)        Method m=tag.getMethod("login");        //返回MyTag类型的注释         MyTag name=m.getAnnotation(MyTag.class);          //输出注释的名称         System.out.println("value is: "+name.name());      }

运行代码,结果如下:

value is: case1

"如何理解Java注解"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

注解 方法 文件 内容 函数 变量 编译 标记 反射 支持 代码 参数 属性 接口 更多 标识 注释 学习 运行 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 上海睿民互联网科技有限公司 为想互联网科技怎么样 科技互联网政务服务 互联网科技有限公司图片 互联网金融与金融科技 顺网科技2021年互联网排名 小米互联网科技园设置 互联网科技项目计划书材料类 厦门千工互联网科技有限公司 互联网科技与大数据专业 佛山市翊博互联网络科技有限公司 山东有哪些互联网科技公司 众安科技工业互联网合作 锡山区互联网智能科技产品供应 智帮互联网科技公司最近动向 广州千川互联网科技有限公司 云南互联网科技学费 恒生互联网科技趋势 互联网 科技节活动 微视频大赛 小米移动互联网科技园 互联网加科技 互联网与科技金融数据 百单互联网科技有限公司 华脉科技工业互联网产品 西藏七维空间互联网科技有限公司 互联网之后的科技是什么 中化能源互联网科技招聘 朱啸虎曾投资哪些互联网科技企业 重庆科技产业互联网有哪些
0