当前位置: 首页 > news >正文

Java中的编译时与运行时注解

Java中的编译时与运行时注解

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!

注解(Annotation)是Java语言的一项重要特性,广泛应用于代码中以提供元数据。注解分为编译时注解和运行时注解,它们在不同阶段发挥作用,有着各自独特的用途和实现方式。本文将详细探讨Java中的编译时注解和运行时注解,包括其原理、使用方法及应用场景。

一、注解概述

1. 注解的基本概念

注解是Java中的一种元数据,可以附加到包、类、方法、字段等元素上。注解本身不包含任何逻辑,但可以在编译时或运行时通过工具或框架来处理。

2. 注解的分类
  • 编译时注解:在编译期间进行处理,通常用于代码生成、静态检查等。
  • 运行时注解:在运行时进行处理,通常用于依赖注入、配置等。

二、编译时注解

编译时注解在Java编译过程中进行处理,通常用于代码生成和静态代码分析。Java提供了注解处理工具(APT)来处理编译时注解。

1. 编译时注解的定义与使用

编译时注解使用@Retention(RetentionPolicy.SOURCE)@Retention(RetentionPolicy.CLASS)进行定义。RetentionPolicy.SOURCE表示注解只在源代码中保留,编译后被丢弃;RetentionPolicy.CLASS表示注解在字节码中保留,但运行时不可见。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.SOURCE)
public @interface MySourceAnnotation {String value();
}
2. 注解处理器

注解处理器用于在编译时处理注解,生成代码或进行检查。实现注解处理器需要继承AbstractProcessor类,并重写process方法。

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import java.util.Set;@SupportedAnnotationTypes("MySourceAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MyAnnotationProcessor extends AbstractProcessor {@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {for (Element element : roundEnv.getElementsAnnotatedWith(MySourceAnnotation.class)) {// 处理注解System.out.println("Processing: " + element.toString());}return true;}
}
3. 编译时注解的应用场景
  • 代码生成:自动生成代码,如DAO层、DTO对象等,减少重复代码。
  • 静态检查:在编译时进行代码检查,确保代码符合规范。

三、运行时注解

运行时注解在Java程序运行期间进行处理,通常用于依赖注入、配置和反射操作。运行时注解通过反射机制获取并处理。

1. 运行时注解的定义与使用

运行时注解使用@Retention(RetentionPolicy.RUNTIME)进行定义。RetentionPolicy.RUNTIME表示注解在运行时可见,可以通过反射获取。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)
public @interface MyRuntimeAnnotation {String value();
}
2. 运行时注解的处理

运行时注解通过反射机制进行处理。通过Class对象获取注解并进行处理。

import java.lang.reflect.Method;public class RuntimeAnnotationProcessor {public static void main(String[] args) throws Exception {Method method = MyClass.class.getMethod("myMethod");if (method.isAnnotationPresent(MyRuntimeAnnotation.class)) {MyRuntimeAnnotation annotation = method.getAnnotation(MyRuntimeAnnotation.class);System.out.println("Annotation value: " + annotation.value());}}
}class MyClass {@MyRuntimeAnnotation("Hello, World!")public void myMethod() {}
}
3. 运行时注解的应用场景
  • 依赖注入:如Spring框架,通过注解实现依赖注入。
  • 配置:通过注解配置框架或库,如JPA中的实体映射。
  • 权限控制:通过注解实现方法级别的权限控制。

四、编译时注解与运行时注解的区别

1. 保留策略
  • 编译时注解:在编译期间进行处理,不保留到运行时。
  • 运行时注解:在运行期间进行处理,通过反射机制获取。
2. 应用场景
  • 编译时注解:适用于代码生成和静态检查。
  • 运行时注解:适用于依赖注入、配置和运行时检查。
3. 性能考虑
  • 编译时注解:处理发生在编译期间,对运行时性能无影响。
  • 运行时注解:处理发生在运行期间,可能对性能有一定影响,需要合理使用。

五、总结

注解是Java语言中强大的元数据机制,通过编译时注解和运行时注解,可以在不同阶段对代码进行处理和增强。编译时注解适用于代码生成和静态检查,而运行时注解则广泛应用于依赖注入、配置和权限控制等场景。在实际开发中,合理选择和使用注解,可以极大提升代码的可维护性和开发效率。

相关文章:

  • SQL中的DISTINCT用法总结
  • MongoDB Map-Reduce 简介
  • Selenium WebDriver - 网络元素
  • c++中string的用法
  • 通用大模型 vs垂直大模型:AI界的“宫斗大戏”
  • font-spider按需生成字体文件
  • 提升数据库性能的关键方法总结
  • starrocks进行数据的删除
  • 基于深度学习的边缘检测
  • Ubuntu开机后图像化界面消失只有命令行界面
  • Python爬虫实战:批量下载网站图片
  • Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的
  • 程序猿大战Python——面向对象——魔法方法
  • Gone框架介绍30 - 使用`goner/gin`提供Web服务
  • 动手学深度学习(Pytorch版)代码实践 -卷积神经网络-28批量规范化
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • canvas 绘制双线技巧
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Linux后台研发超实用命令总结
  • Linux快速复制或删除大量小文件
  • Promise面试题,控制异步流程
  • React系列之 Redux 架构模式
  • spring学习第二天
  • Vue小说阅读器(仿追书神器)
  • windows下使用nginx调试简介
  • Yii源码解读-服务定位器(Service Locator)
  • 从零开始在ubuntu上搭建node开发环境
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 和 || 运算
  • 机器学习 vs. 深度学习
  • 技术胖1-4季视频复习— (看视频笔记)
  • 今年的LC3大会没了?
  • 七牛云假注销小指南
  • 通过npm或yarn自动生成vue组件
  • 王永庆:技术创新改变教育未来
  • 异常机制详解
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 2017年360最后一道编程题
  • 如何用纯 CSS 创作一个货车 loader
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #pragma multi_compile #pragma shader_feature
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)svelte 教程:hello world
  • (26)4.7 字符函数和字符串函数
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (分布式缓存)Redis哨兵
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题