二(8.3):Java中的注解

java 8 - 多重注解,重复注解 文章目录java 8 - 多重注解,重复注解1、构建单注解2、构建注解组3、环切切入4、使用注解5、应用场景1、取代注解组2、缓存,权限,日志等的应用6、实现原理7、存在的问题 java 8 - 多重注解,重复注解 1、构建单注解 import java.lang.annotation.*; /** @author Created by 谭健 on 2019/10/9. 星期三. 14:19.... 阅读详情

注解本身没有任何业务逻辑,它只是写在类、方法、属性或者参数上的“元数据”(用来描述数据的数据)。它就像是一张“便签纸”,贴在代码的各个角落,等着其他人(编译器或框架)来读取。

1. 注解的长相与结构

我们在代码里看到的 @Override、@Autowired、@Slf4j,它们的底层其实都是一种特殊的接口。

如果你自己去定义一个注解,代码长这样:

// 1. 🚨 关键:使用 @interface 来定义
public @interface MyTag {
    // 注解的属性,长得很像方法
    String value() default "默认值";
    int age() default 18;
}

而在使用它的时候,就像在填表格:

@MyTag(value = "正式员工", age = 25)
public class Employee {
    // ...
}

元注解(Meta-Annotations)

Java 官方为了让我们能控制自己写的注解,提供了几个专门用来修饰注解的注解,叫做元注解。

① @Target:限制这个标签能贴在哪里
你得规定这个便签是贴在“人(类)”额头上,还是贴在“手(方法)”上。

  • ElementType.TYPE:只能贴在类、接口、枚举上。
  • ElementType.METHOD:只能贴在方法上。
  • ElementType.FIELD:只能贴在属性字段上。

② @Retention:限制这个标签能活多久(生命周期)
这是注解最核心的属性,它决定了注解的命运,一共有三种寿命(三种策略):

  • RetentionPolicy.SOURCE(只活在源码期):
    代码编译成 .class 文件后,这个注解就消失了。
    代表作:@Override(给编译器看的)、Lombok 的 @Slf4j(编译完就卸磨杀驴)。

  • RetentionPolicy.CLASS(活到字节码期,默认):
    注解会被保留到 .class 文件里,但 JVM 启动加载它时,会把它丢弃。

  • RetentionPolicy.RUNTIME(活到运行期):
    系统运行起来后,注解依然常驻内存。
    代表作:Spring 的 @Controller、@Autowired。因为活得久,所以运行期可以通过反射去读取它。

3. 注解是如何生效的?

注解本身只是个死标签,如果不去读它,它和注释没有任何区别。能让它发挥魔法的,是背后的“注解处理器”。它主要分为两大门派:

门派 A:编译期动态修改(Lombok 派)

  • 寿命:SOURCE 级别。
  • 原理:Java 编译器在编译代码时,会调用它的插件(注解处理器)。插件发现有这个注解,就直接修改你的语法树,或者生成新的代码。
  • 结果:打出来的 .class 包里,注解没了,但多了很多行自动生成的代码。

门派 B:运行期反射解析(Spring / Hibernate 派)

  • 寿命:RUNTIME 级别。
  • 原理:程序启动后,Spring 等框架会化身“检查员”,利用 Java 反射机制 去遍历所有的类和方法,寻找特定的标签。
  • 结果:发现类上有 @Controller,就把它实例话放进容器;发现属性上有 @Autowired,就自动把对象塞进去。

4. 手写自定义注解

工作中 90% 的自定义注解都是为了结合反射,在运行时根据注解做逻辑处理(模仿 Spring 的 @Autowired 或 @RequestMapping)。

步骤 1:定义一个运行时注解

import java.lang.annotation.*;

// 1. 限定贴在 字段 上
@Target(ElementType.FIELD)
// 2. 必须保留到运行时(否则反射读不到)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAutowired {
    // 注解的属性:看起来像方法,使用时像变量
    String value() default ""; // 默认值为空字符串
}

步骤 2:使用该注解

public class UserService {
    @MyAutowired("注入用户服务实现") // 给属性贴标签
    private String serviceName;
    
    public void printService() {
        System.out.println("服务名:" + serviceName);
    }
}

步骤 3:通过反射解析注解(核心逻辑)

import java.lang.reflect.Field;

public class AnnotationProcessor {
    public static void main(String[] args) throws IllegalAccessException {
        UserService userService = new UserService();
        
        // 获取所有字段(包括私有字段)
        Field[] fields = userService.getClass().getDeclaredFields();
        for (Field field : fields) {
            // 检查字段上是否贴了 @MyAutowired 注解
            if (field.isAnnotationPresent(MyAutowired.class)) {
                // 读取注解上的值
                MyAutowired annotation = field.getAnnotation(MyAutowired.class);
                String injectedValue = annotation.value(); // 获取到 "注入用户服务实现"
                
                // 暴力破解私有权限,把值设进去(模拟依赖注入)
                field.setAccessible(true);
                field.set(userService, injectedValue);
            }
        }
        
        // 输出结果:服务名:注入用户服务实现
        userService.printService(); 
    }
}
保姆级教程:在Ubuntu 22.04上用Conda搞定nuPlan数据集环境(Python 3.9 + PyTorch) 本文提供了一份详细的Ubuntu 22.04环境下使用Conda配置nuPlan自动驾驶数据集的保姆级教程,涵盖Python 3.9安装、Conda环境管理、PyTorch配置及数据集可视化验证等关键步骤,帮助开发者高效搭建开发环境。 阅读详情

相关推荐

金蝶EAS uploadlogo漏洞实战:如何快速检测你的系统是否受影响

本文详细解析了金蝶EAS uploadlogo任意文件上传漏洞的检测与防护方法,帮助企业安全团队快速识别系统风险。通过资产发现、漏洞验证和应急响应方案,有效防范财务数据泄露和系统入侵风险,提升企业整体安全防护能力。

weixin_29322553的博客 386

java 8中的注解_Java 中的注解

注解的基础知识元注解:@Retention @Target @Document @InheritedAnnotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口。参数成员只能用public或默认(default)这两个访问权修饰参数成员只能用基本类型byte,short,char,int,l...

weixin_34851493的博客 781

从3dB定向耦合器到双圆极化天线:在HFSS里玩转相位差90°的馈电艺术

本文详细介绍了在HFSS中设计3dB定向耦合器与双圆极化天线的关键技术,重点解析了90°相位差生成原理及馈电网络设计。通过HFSS仿真工具,实现从定向耦合器到完整天线系统的集成,优化阵列天线性能,适用于卫星通信和雷达系统。

weixin_33717117的博客 556

Java和Android中的注解

java和android的注解简析

C.Shawn 1万+

手把手教你用Logisim搞定华科计组实验:单总线CPU硬布线控制器设计(含Excel自动生成电路技巧)

本文详细解析了如何使用Logisim完成华科计组实验中的单总线CPU硬布线控制器设计,特别分享了利用Excel自动生成电路逻辑的高效技巧。从实验准备、状态机表格填写到模块化构建和系统联调,提供全流程实战指导,帮助读者快速掌握计算机组成原理核心概念,大幅提升实验效率。

weixin_28744423的博客 321

在MDK5.37版本中添加Complier Version 5( 解决Missing Compiler Version 5 )

本文章仅作为个人学习记录,方法也是从其他博主的博客中得到的,链接如下:二、Keil——Missing Compiler Version 5 和 core_cm3.c 问题解决 - YI颗白菜 - 博客园 (cnblogs.com) 问题描述 更新最新的keil版本(MDK5.37)后,在编译以前版本的工程文件时,发现出现了非常多的报错,在网上搜索之后发现原来时编译器版本不匹配的问题,即MDK5.37中使用的是Version 6版本的编译器,而缺少Version 5,对于以前编写的工

leveling99的博客 1万+

Java 中的注解详解(包含Java8新增注解)

Java 注解是元数据的一种形式,注解可以用来给应用程序提供数据,不过这些数据并不是程序本身的一部分。注解对所注解的代码逻辑没有直接影响。作为编译器的信息载体——编译器可以使用注解来检测错误或压制警告。作为编译时和部署时处理的信息载体——软件工具可以处理注解信息,用来生成代码、XML文件等等。作为运行时处理的信息载体——有些注解可以在运行时进行检查。注解的本质就是一个继承了 Annotation 接口的接口,一个注解只不过是一种特殊的注释而已,如果没有解析它的代码,它连注释都不如。

swadian2008的博客 1784

AutoDock Vina实战:从零开始完成分子对接(附7VU6案例详解)

本文提供了一份详细的AutoDock Vina分子对接实战指南,以SARS-CoV-2 3CL蛋白酶(PDB ID: 7VU6)为例,从零开始手把手教学。内容涵盖软件安装、环境配置、受体与配体文件准备、对接参数设置,以及结果分析与可视化解读,旨在帮助计算生物学与药物发现领域的新手快速掌握这一核心技能。

ooo22的博客 536

Java注解

当我们理解了内置注解, 元注解和获取注解的反射接口后,我们便可以开始自定义注解了。定义自己的注解使用注解@Override用反射接口获取注解信息try {// 获取所有methods// 遍历// 方法上是否有MyMethodAnnotation注解try {// 获取并遍历方法上的所有注解// 获取MyMethodAnnotation对象信息测试的输出最为常见的就是使用Spring AOP切面实现统一的操作日志管理。

YLXCA的博客 915

【项目实战】主流车载操作系统,QNX实时操作系统入门介绍

QNX是一种实时操作系统,自1980年代初期由Quantum Software Systems成立以来,已被广泛应用于各种行业和领域。QNX具有实时响应、高可靠性和分布式等特点,为各种设备提供了强大的底层操作系统平台。随着科技的不断发展和进步,QNX系统的应用范围和潜力也在不断扩大。本文将全面介绍QNX系统,包括其引言、背景、系统特性、应用领域和生态系统等方面。QNX作为一种实时操作系统,具有高效的实时性能、高可靠性、分布式、可剪裁性和可扩展性等特点。它在各个领域都有广泛的应用,并拥有一个庞大的生态系统。

奶爸的编程之路,也就一周冷个三天 3071

PCIe Base Specification解析(二)

PCIe事务层,Transaction Layer Specification

Crazzy_M的博客 1292

Java最新玩转Java注解:元注解、内置注解、自定义注解的原理和实现,做了6年的Java

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!大家看完有什么不懂的可以在下方留言讨论也可以关注。本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取return “我是重新定义过的toString方法”;

2401_84024576的博客 790

SAP SD模块定价过程后台配置简介

只有手工输入定价时(例如,在定价中的定价浏览屏幕中),或者只有从外部处理转移这些定价时(例如,成本核算),才将这些定价包括在确定(价格确定、输出确定,批次确定)之中。定价过程的定义和分配是SD模块中最核心的配置,包含了条件表、条件类型、存取顺序、发票类型、客户定价过程等,确定了销售订单已什么价格销售、税率、附加折扣等多个条件行程有一个定价过程。12、小计:记录该条件类型在VBAP表中是否存储,以及其后续用途,如记入信贷,占用信贷额度,记入成本等,如果需要金额暂用信贷额度的话,在小计这里选择A即可。

我小时候很黑的博客 3782

Jetty8——实现Servlet 3 注解

有时候工作时,发现项目本地开发竟然使用到了jetty作为本地开发,好奇的我苦苦地终于略懂了一些用法,任何的进步都是有代价,我愿在此写下这几天的经历,以供后来着略参观。背景:Maven2 下的Web工程,研究对象为Servlet 3的新特性,注解,这是着重的重点(表达语句没啥问题/han),在Jetty 8运行,为什么是jetty8?注解@WebServlet 这是Servlet3 新特性,浏览了一下

在此立一个IT职业上的flag:https://github.com/Zeb-D/my-review 2万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java中的注解,自定义注解

注解(Annotation)是从JDK5.0开始引入,以“@注解名”在代码中存在。 Annotation 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值,这些信息被保存在 Annotation 的 “name=value” 对中。 注解可以在类编译、运行时进行加载,体现不同的功能。

Lifelong learning 1529

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Java8新特性】重复注解与类型注解,你真的学会了吗?

无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。otation.*;/**@description 定义注解*/无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。

2401_85377564的博客 807

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

浅谈java8之@FunctionalInterface注解

1.什么是函数式接口(Functional Interface) 函数式接口首先必须是一个接口,接口里面只能有一个抽象方法(允许有默认方法、静态方法等);这种类型的接口也称为SAM接口,即Single Abstract Method Interface。 2.函数式的接口创建 可以使用Lambda表达式、方法引用或构造函数引用创建函数式接口。 如下定义了一个函数式接口: package c...

OceanSky的专栏 8741

nonnull注解_Java 8 注解探秘

(给ImportNew加星标,提高Java技能)编译:ImportNew/唐尤华dzone.com/articles/explore-annotations-in-java-8图中的海洋里有很多注解!Java SE 1.5引入了注解,程序员通过注解可以为程序编写元数据(metadata)。根据 Oracle 官方文档,注解的定义如下:“注解是元数据的一种形式,提供与程序相关的数据,该数据...

weixin_42355003的博客 1551

java中的枚举类与注解

java中的枚举类与注解一、枚举类的使用1、 自定义枚举类2、使用enum定义枚举类二、注解(Annotation)1、概述2、常见的Annotation示例3、 自定义 Annotation4、JDK中的元注解1、@Retention2、@Target3、@Documented和@Inherited5、利用反射获取注解信息6、JDK8中注解的新特性 一、枚举类的使用 1、 自定义枚举类 c...

仰望与追逐的博客 2288

Java中的注解详解

摘要 Java注解是JDK5引入的元数据机制,通过@interface定义,为代码元素添加结构化信息。核心作用包括触发编译器检查、生成模板代码、运行时行为注入等。Java内置10个核心注解,分为实用注解(如@Override、@Deprecated)和元注解(如@Target、@Retention)。注解类型包括元注解、内置功能注解和自定义注解三类。使用时需注意目标匹配、参数必填、生命周期等规则。自定义注解通过元注解定义行为,可包含带默认值的元素,实现声明式编程范式。

努力分享一些干货 908

java 8 新特性之重复注解与类型注解

Java 8对注解处理提供了两点改进:可重复的注解及可用于类型的注解。  1、自定义可重复注解:使用@Repeatable元注解,参数为可重复注解的容器 @Repeatable(MyAnnotations.class) @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, ...

MrLee的博客 745

java中的注解

Java 注解(Annotation)是 Java 5 引入的一个重要特性,它是一种元数据,提供给程序员在代码中添加注释和标记的方式。注解不直接影响程序的执行,但是可以为编译器和其他工具提供重要的信息。注解是将元数据与类、方法、字段等程序元素关联的一种简单而强大的方式。在本教程中,我们将探讨 Java 注解的基本概念、使用方法和应用场景。

qq_51110877的博客 1820

java8 注解_Java 8 注解探秘

Java SE 1.5引入了注解,程序员通过注解可以为程序编写元数据(metadata)。根据 Oracle 官方文档,注解的定义如下:“注解是元数据的一种形式,提供与程序相关的数据,该数据不是程序本身的一部分”。可以在代码中的任何位置使用注解,比如类、方法和变量上使用。从 Java 8开始,注解也可以用于类型声明。注解代码与程序本身没有任何直接关系,只有其他程序或 JVM 利用注解信息实现特定功...

weixin_39687192的博客 266

Java8——重复注解和类型注解

重复注解  可以在一个类上或方法上重复多次使用的注解 示例  1、自定义可重复注解:使用@Repeatable元注解,参数为可重复注解的容器 @Repeatable(MyAnnotations.class) @Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD }) @Retention(RetentionPolicy....

如不來的博客 2050

java基础知识③:反射和注解以及Java 8的新特性

反射和注解以及Java 8的新特性

两点 1295

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 347
上一篇: 3.0 java中继承中的super作用
下一篇: 1:配置git
偏爱自由 !
博客等级 码龄6年 12粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值