java中的注解原理是什么?

news2024/9/25 11:19:02

Java中的注解(Annotations)是一种用于提供元数据的机制。它可以通过在代码中添加注解的形式,将一些额外的信息嵌入到代码里。注解本质上不会改变程序的实际逻辑行为,但是可以帮助开发工具、编译器、框架等获取这些元数据,执行相应的处理。

下面我们来详细介绍Java中注解的原理:

目录

1. 注解的定义

2. 注解的分类

3. 注解的保留策略

4. 注解的作用目标

5. 注解的访问

6. 注解的实际应用

7. 注解处理器(Annotation Processor)

总结


1. 注解的定义

注解是Java 5引入的一项语言特性,它本质上是一种特殊的接口,所有的注解都继承自java.lang.annotation.Annotation接口。注解的定义方式类似于接口,不过是在前面加上@interface关键字。

public @interface MyAnnotation {
    String value();
}

2. 注解的分类

注解可以大致分为以下几类:

  • 标准注解(Standard Annotations):Java SDK自带的一些注解,比如@Override@Deprecated@SuppressWarnings等。
  • 元注解(Meta-annotations):用于描述其他注解的注解,Java提供了以下几个常用的元注解:
    • @Retention:定义注解的保留策略。
    • @Target:定义注解可以使用的地方(如类、方法、字段等)。
    • @Documented:说明该注解将包含在JavaDoc中。
    • @Inherited:允许子类继承父类中的注解。

3. 注解的保留策略

注解的保留策略决定了注解在什么阶段可以被访问。通过@Retention元注解指定。它有三个取值:

  • SOURCE:注解只在源码中保留,编译时会被丢弃,不会保留在字节码中。
  • CLASS:注解在编译时被保留,但JVM运行时不会加载。这是默认的策略。
  • RUNTIME:注解会被保留到运行时,因此可以通过反射在运行时访问注解的信息。
@Retention(RetentionPolicy.RUNTIME)
public @interface MyRuntimeAnnotation {
    String value();
}

4. 注解的作用目标

通过@Target元注解可以指定注解的应用范围,比如可以作用于类、方法、字段等。其取值有以下几种:

  • ElementType.TYPE:类、接口或枚举类型。
  • ElementType.FIELD:字段、枚举的常量。
  • ElementType.METHOD:方法。
  • ElementType.PARAMETER:方法的参数。
  • ElementType.CONSTRUCTOR:构造函数。
  • ElementType.LOCAL_VARIABLE:局部变量。
  • ElementType.ANNOTATION_TYPE:注解。
  • ElementType.PACKAGE:包。
@Target(ElementType.METHOD)
public @interface MyMethodAnnotation {
    String description();
}

5. 注解的访问

注解可以通过反射机制进行访问。假如我们为某个类或方法加上了自定义的注解,那么在运行时可以通过Java反射机制读取这些注解并根据注解的值做出相应的处理。

例如,定义一个注解并将其应用于方法:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value() default "default value";
}

应用注解:

public class MyClass {
    @MyAnnotation(value = "custom value")
    public void myMethod() {
        System.out.println("This is a method with annotation.");
    }
}

通过反射读取注解:

import java.lang.reflect.Method;

public class AnnotationTest {
    public static void main(String[] args) throws Exception {
        Method method = MyClass.class.getMethod("myMethod");

        if (method.isAnnotationPresent(MyAnnotation.class)) {
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
            System.out.println("Annotation value: " + annotation.value());
        }
    }
}

运行结果:

Annotation value: custom value

6. 注解的实际应用

注解在Java开发中有非常广泛的应用,常见的使用场景包括:

  • 标识代码信息:如@Override用于标识重写父类方法,@Deprecated用于标识废弃方法。
  • 依赖注入:如Spring中的@Autowired,用于将Bean自动注入到应用中。
  • 框架配置:很多框架使用注解来进行配置,比如Spring中的@Controller@Service等。
  • 编译时检查:注解可以结合注解处理器进行编译时的检查和代码生成,如@NotNull用于标识参数不能为null。

7. 注解处理器(Annotation Processor)

注解处理器可以在编译期间处理自定义的注解,通常用于生成代码或进行编译期校验。Java提供了javax.annotation.processing包中的类来实现这一功能。通过实现Processor接口,可以创建自己的注解处理器。

总结

Java注解是一种强大的元数据机制,能够在编译时、类加载时或者运行时提供信息,进而通过反射、框架等对这些信息进行处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2138123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短信验证码倒计时 (直接复制即可使用) vue3

需求&#xff1a; 要实现一个获取验证码的需求&#xff0c;点击获取验证码60秒内不可以重复点击&#xff0c;方式有两种可以直接复制使用&#xff1b; 效果图 实现方案 方案1 (单个文件内使用比较推荐) <el-button :disabled"codeDisabled" click.stop"h…

SQL进阶的技巧:如何实现某列的累计乘积?

0 场景描述 在做数据处理的时候,尤其是复利累积的时候,有时候会有这样一场景,通过某种条件找到一列数据[X1,X2,X3...Xn],然后想要求y=X1X2X3...Xn。下面给出一个具体案例来详细解释这一问题,如下图所示,每个组的name值只有2个(2个A/B/C),当name=A or C时,price为value…

鸡蛋检测系统源码分享

鸡蛋检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

python webapi上传文件

一、安装 pip install Flask 二、 编写上传文件接口webapi.py http://127.0.0.1:5000/upload from flask import Flask,request from werkzeug.utils import secure_filename import uuidapp Flask(__name__)app.route(/) def hello_world():return Hello, World!app.post(…

MySQl篇(基本介绍)(持续更新迭代)

目录 一、为什么要使用数据库 1. 以前存储数据的方式 2. 什么是数据库 3. 采用的数据库的好处 4. 如何理解数据库、数据库管理系统、SQL 5. 如何理解数据是有组织的存储 6. 现在的数据库 二、关系型数据系统 1. 什么是关系型数据库 2. 关系型数据库特点 3. 关系型数据…

p11 日志,元数据,进程的查看

直接运行docker run -d centos这个时候回启动容器&#xff0c;但是因为容器里面没有前台进程所以这个时候docker会把没用的进程给停止掉&#xff0c;可以看到docker ps命令没有查看到任何的正在运行的容器 但是如果说你使用 -it命令进入到了容器里面&#xff0c;这个他就不会…

并发编程 - 锁(属性修饰符 atomic)

引言 在多线程编程中&#xff0c;数据一致性是一个必须解决的问题。多个线程同时访问同一片共享数据时&#xff0c;极易发生竞争条件&#xff08;race conditions&#xff09;&#xff0c;导致数据的不一致性&#xff0c;甚至程序崩溃。为了解决这些问题&#xff0c;我们需要引…

Vulnhub:BlueSky

靶机下载地址 信息收集 主机发现 nmap扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 靶机ip&#xff1a;192.168.31.171。 端口扫描 nmap 192.168.31.171 -A -p- -T4 开放端口22,8080。 目录扫描 访问8080端口&#xff0c;如图&#xff0c;是tomcat管理页面…

Vue3.0组合式API:使用reactive()、ref()创建响应式代理对象

1、reactive() 方法 reactive() 方法用于将定义的 JavaScript 对象转换为响应式对象。 使用方法&#xff1a; <script setup> //第一步&#xff1a;导入函数 import { reactive } from vue;//第二步&#xff1a;创建响应式对象 const data reactive(对象类型的数据);…

prompt实用技巧-AI+Mermaid【酷炫钉钉文档】

AI 新技能&#xff0c;最近 chatGPTo1 发布后模型能力出现了新的跨越&#xff0c;之前模型的一本正经的胡说八道幻想模式&#xff0c;让AI 对待理科推理明显弱于文案的 AGI 的生成。 prompt engineer 工程师程序员的福音 prompt 内容如下&#xff0c; 按照以上格式生成创建公…

C++ Primer Plus(速记版)-类和数据抽象

第十二章 类 在 C 中&#xff0c;用类来定义自己的抽象数据类型。 12.1. 类的定义和声明 12.1.1. 类定义&#xff1a;扼要重述 最简单地说&#xff0c;类就是定义了一个新的类型和一个新作用域。 类成员 类成员可以是属性、方法或类型别名。 成员可以是公有&#xff08;publ…

CPU 缓存的局部性特性

CPU 缓存的局部性特性是现代处理器中用来提高程序执行效率的重要原理。局部性特性是指程序在运行时&#xff0c;其数据和指令的访问具有一定的规律性&#xff0c;主要体现在时间局部性和空间局部性两方面。利用这些规律&#xff0c;CPU 可以更高效地管理缓存&#xff0c;减少从…

github远程仓库环境搭建及使用

目录 1、创建一台虚拟机 centos 源的配置 备份源 修改源 重新加载缓存 安装软件 配置epel 2、关闭防火墙和selinux 关闭防火墙 临时关闭SELinux 永久关闭SELinux&#xff1a;编辑SELinux的配置文件 配置文件的修改内容 3、git是本地仓库&#xff0c;linux系统中一…

CleanClip:Mac上的剪贴板神器,轻松追溯历史记录

CleanClip 是一款功能强大的 Mac 剪贴板历史管理工具,它可以帮助用户轻松地管理和追溯复制粘贴的历史记录。CleanClip 能够保存用户复制过的所有内容,包括文本、图片、文件等,并且提供了多种视图模式,包括列表视图和网格视图,方便用户快速找到需要的内容。 评论区获取软件 Cl…

查询中的算术表达式

需要修改数据显示方式&#xff0c;如执行计算&#xff0c;或者作假定推测&#xff0c;这些都可能用到算术表达式。 一个算术表达式可以包含列名、固定的数字值和算术运算符。 使用算术运算符 示例&#xff1a;查询雇员的年薪&#xff0c;并显示他们的雇员ID&#xff0c;名字…

【计算机网络】应用层序列化

目录 一、序列化和反序列化二、重新理解 read、write、recv、send 和 tcp 为什么支持全双工三、Jsoncpp 一、序列化和反序列化 如果我们要实现一个网络版的加法器&#xff0c;需要把客户端的数据发给服务端&#xff0c;由服务端处理数据&#xff0c;再把处理结果发给客户端。 …

【线程】线程的概念

本文重点&#xff1a; 了解线程概念&#xff0c;理解线程与进程区别与联系 线程的概念 线程是进程内的一个执行分支&#xff0c;执行粒度要比进程细 乍一看&#xff0c;肯定不懂&#xff0c;太抽象了&#xff0c;怎么理解呢&#xff1f; 以前讲的进程&#xff0c;每个进程…

spring boot设置多环境的配置文件

目录 说明规划步骤案例application.ymlapplication-dev.ymlapplication-test.ymlapplication-prod.yml 说明 在项目开发过程中&#xff0c;回有开发环境、测试环境、生产环境等等。如果所有环境的配置都放在application.yml中并且需要打包到不同的环境中时&#xff0c;修改app…

还在用旧的电脑屏保?新一代电脑屏保你见识过吗?

还在用旧的电脑屏保&#xff1f;新一代电脑屏保你见识过吗&#xff1f;旧的电脑屏保我们已经见怪不怪了&#xff0c;没有什么新颖的效果&#xff0c;而新一代的电脑屏保在视觉上做了很多突破。一个好看的屏保&#xff0c;会让你的电脑变得更加美观&#xff0c;更有特色。哪里才…

SpringSecurity原理解析(七):权限校验流程

SpringSecurity是一个权限管理框架&#xff0c;核心功能就是认证和授权&#xff1b;前边已经介绍了认证流程&#xff0c; 这里看下授权的流程和核心类。 一、权限管理的实现 1、开启对权限管理的注解控制 工程中后端各种请求资源要想被SpringSecurity的权限管理控制&#xf…