惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
D
Docker
月光博客
月光博客
MongoDB | Blog
MongoDB | Blog
Vercel News
Vercel News
美团技术团队
博客园 - 叶小钗
I
InfoQ
Jina AI
Jina AI
博客园 - 司徒正美
雷峰网
雷峰网
B
Blog
Y
Y Combinator Blog
A
About on SuperTechFans
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
Microsoft Security Blog
Microsoft Security Blog
Stack Overflow Blog
Stack Overflow Blog
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recent Announcements
Recent Announcements
V
V2EX
N
Netflix TechBlog - Medium

码云笔记

Pinia v4 发布:Vue 状态管理进入新时代 Linux LVM:故障排查与数据恢复指南 Java中wait()与sleep()方法的不同点是什么? Bonsai27B 重磅落地!27B 大模型实现手机本地运行 ES2026 第 17 版新增的 5 个新特性 高德重磅上线 ABot‑World Studio,消费级显卡就能搭建专属 3D 虚拟世界 Java中final、finally和finalize的区别是什么? 怎么修改Ollama及其模型的默认路径?Ollama路径修改、迁移与重启的操作教程 iOS27 公开测试版正式上线!AI Siri 与液态玻璃成最大看点 Yuku正式发布!比 Vite+ 快 5.4 倍的前端工具链 Linux lsof 命令详解:进程与文件监控实战 Claude Code CLI命令手册 代码审查重构Bug修复场景化工作流 OpenClaw中连接并使用本地Ollama模型的操作教程 GPT-5.6 今天正式上线:OpenAI 掏出”太阳系”全家桶,Sol / Terra / Luna 齐发,打的却是一张”效率牌” Nacos MySQL持久化部署完整教程 GPT-5.6系列正式上线:OpenAI以效能与性价比重塑AI行业竞争格局 Java中序列化与反序列化的概念是什么? 如何在HTML中实现字体颜色根据背景自动变化? JDK动态代理与CGLIB动态代理的区别是什么? OpenClaw数据加密敏感信息保护的完整教程 砸超亿美元算力!亚马逊秘密启动Moonraker项目,Alexa迎来颠覆性升级 PHP 最轻量、结构化 .docx 到 Markdown 转换器 Elephant TypeScript 7.0 正式发布 蚂蚁灵波开源全球首款 MoE 具身视频大模型 LingBot-Video,为机器人世界模型搭建新底座 SpaceX AI联合Cursor推出Grok 4.5 搅动专业AI赛道格局 英伟达Vera CPU落地商用,改写AI代理时代算力竞争规则 什么是端点检测与响应(EDR)以及它的工作原理介绍 Anime.js 已经 10 岁了!作者查出脑瘤,V5 将开始收费! 星链开启全面升级!SpaceX申请十万颗卫星,构建AI时代全球天基基建 PHP 通用表达式语言 CEL-PHP 2.0.0 正式发布!
Java注解的实现原理是什么?
慧思 普通 · 2026-06-12 · via 码云笔记

AI 概述

Java注解是以@开头的代码标签,分内置、自定义、元注解三类。它有SOURCE、CLASS、RUNTIME三种生命周期,可通过@Target限定作用范围。可借助反射在运行时、APT在编译时解析处理,广泛应用于Spring、Lombok等框架,也能实现权限校验、AOP等功能,简化开发。

目录

文章目录隐藏

  1. 1. 什么是注解?
  2. 2. 注解的分类:
  3. 3. 注解的原理:
  4. 4. 实际用途:

Java 注解的实现原理是什么?

1. 什么是注解?

  • 注解就是给代码加标签,可以在类、方法、字段等地方标记一些额外的信息。
  • 注解自己不做事情,它需要一些工具或框架来读取和处理,这样就能实现一些额外的功能。

2. 注解的分类:

  • 内置注解:Java 自带的一些注解,比如@Override(表示方法是重写的)和@Deprecated(表示方法不推荐再用)。
  • 自定义注解:你自己定义的注解,用来实现自己需要的功能。
  • 元注解:像@Retention@Target这样的注解,用来设置其他注解的规则。

3. 注解的原理:

  • Java 提供了反射注解处理器,可以在程序运行时或者编译时读取注解。
  • 注解的存活时间由 RetentionPolicy 决定:
    • SOURCE:只存在源代码里,编译后就没有了。
    • CLASS:保留在字节码文件里,但运行时看不到。
    • RUNTIME:保留在字节码里,程序运行时可以通过反射读取。

4. 实际用途:

  • 框架开发:像 Spring AOP 或 MyBatis 用注解自动生成代码。
  • 代码检查:比如@Override用来确保你重写的方法是正确的。
  • 编译时工具:像Lombok用注解自动生成代码,减少手动写。

知识内容

1. 注解的核心概念

1.1 什么是注解?

注解 是用 @ 开头的一种结构,用来描述代码的额外信息。

示例:内置注解

@Override
public String toString() {
    return "示例";
}

示例:自定义注解

@MyAnnotation(value = "测试注解")
public void testMethod() {}

解析

注解本质是对代码的描述,最终由编译器、工具或运行时框架进行解析。

1.2 注解的生命周期

注解的生命周期由@Retention决定,可以分为三类:

  • SOURCE:仅在源码中有效,编译后会被丢弃。
  • CLASS:保留到字节码文件中,运行时不可见。
  • RUNTIME:保留到字节码中,运行时可通过反射解析。

示例代码

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME) // 生命周期为运行时
@interface MyAnnotation {
    String value();
}

1.3 注解的适用范围

通过@Target定义注解的作用范围:

  • ElementType.TYPE:作用于类或接口。
  • ElementType.METHOD:作用于方法。
  • ElementType.FIELD:作用于字段。

示例代码

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.FIELD})
@interface MyAnnotation {}

1.4 注解的组成

一个注解可以包含以下部分:

  • 元注解:定义注解的行为(如生命周期、作用范围)。
  • 属性(成员变量):注解的参数,可以有默认值。
  • 默认值:通过 default 关键字指定。

完整示例

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME) // 注解生命周期
@Target({ElementType.METHOD}) // 注解适用范围
@interface MyAnnotation {
    String value() default "默认值"; // 成员变量
}

2. 注解的解析原理

2.1 运行时解析:通过反射获取注解

Java 的 反射机制 提供了运行时解析注解的能力。

示例:通过反射获取注解

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;

// 自定义运行时注解
@Retention(RetentionPolicy.RUNTIME)
@interface Log {
    String value() default "执行方法";
}

// 使用注解
class Demo {
    @Log("执行 myMethod 方法")
    public void myMethod() {
        System.out.println("方法运行中...");
    }
}

public class AnnotationReflection {
    public static void main(String[] args) throws Exception {
        // 获取方法上的注解
        Method method = Demo.class.getMethod("myMethod");
        if (method.isAnnotationPresent(Log.class)) {
            Log log = method.getAnnotation(Log.class);
            System.out.println("注解值:" + log.value());
        }

        // 调用实际方法
        new Demo().myMethod();
    }
}

输出结果:

注解值:执行 myMethod 方法
方法运行中...

2.2 编译时处理:APT

注解处理器(Annotation Processing Tool, APT) 是 Java 提供的编译时工具,用于扫描和处理注解。

APT 工作流程

  1. 编译器扫描源代码中的注解。
  2. 注解处理器解析注解信息。
  3. 根据注解生成代码或文件。

示例:APT 自动生成代码

import javax.annotation.processing.*;
import javax.lang.model.element.*;
import java.io.*;

@SupportedAnnotationTypes("MyAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MyAnnotationProcessor extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (Element element : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) {
            String className = element.getSimpleName().toString();
            try (Writer writer = processingEnv.getFiler()
                    .createSourceFile(className + "Generated")
                    .openWriter()) {
                writer.write("public class " + className + "Generated {}");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return true;
    }
}

解析

通过 APT 可以在编译时自动生成代码,广泛用于框架开发。

3. 注解的实际应用

(1) Spring 框架中的注解

  • @Autowired:自动装配依赖。
  • @Transactional:声明事务。
  • @Controller:标记控制器类。

(2) Lombok 注解

Lombok 使用注解简化代码开发,例如:

  • @Getter@Setter自动生成 getter/setter 方法。
  • @Builder构造 Builder 模式。

(3) 权限校验

通过自定义注解实现方法级别的权限控制。

示例:基于注解的权限校验

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface Permission {
    String role();
}

class UserController {
    @Permission(role = "ADMIN")
    public void deleteUser() {
        System.out.println("用户已被删除");
    }
}

知识拓展

1. 元注解的底层实现

元注解是控制注解行为的注解,例如:

  • @Retention:通过 RetentionPolicy 决定注解生命周期。
  • @Target:通过 ElementType 限定注解的使用范围。

2. 动态代理与注解的结合

动态代理结合注解可实现 AOP(面向切面编程)。例如:

  • 在方法执行前后添加日志记录。
  • 结合事务注解实现自动提交和回滚。

推荐阅读:

详解 Java 实体类的注解 @Data@NoArgsConstructor@AllArgsConstructor@ToString

Java 中如何使用 @Builder 注解

以上关于Java注解的实现原理是什么?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Java注解的实现原理是什么?