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

17.Java 注解与实例

17.Java 注解与实例

什么是注解

注解(Annotation)是 Java 5 引入的一种元数据(metadata)机制,它为代码提供附加信息,但不直接影响代码逻辑。注解可以用于:

  • 编译时检查(如 @Override
  • 运行时处理(如框架配置)
  • 代码生成工具(如 Lombok)

元注解

元注解是用于注解其他注解的注解。Java 提供了四个标准的元注解:

  1. @Retention - 指定注解的保留策略

    • SOURCE:仅保留在源码中,编译时丢弃
    • CLASS:保留在字节码中,但运行时不可见(默认)
    • RUNTIME:保留在运行时,可通过反射获取
  2. @Target - 指定注解可以应用的目标

    • TYPE:类、接口、枚举
    • FIELD:字段
    • METHOD:方法
    • PARAMETER:参数
    • CONSTRUCTOR:构造方法
    • LOCAL_VARIABLE:局部变量
    • ANNOTATION_TYPE:注解类型
    • PACKAGE:包
  3. @Documented - 指示注解应包含在 Javadoc 中

  4. @Inherited - 指示子类可以继承父类的注解

自定义注解实例

下面我们将创建一个完整的自定义注解示例,包括元注解的使用和运行时反射处理。

1. 定义自定义注解

package com.example.annotation;import java.lang.annotation.*;/*** 自定义注解示例** @Retention(RetentionPolicy.RUNTIME) - 注解在运行时保留,可通过反射获取* @Target({ElementType.METHOD, ElementType.TYPE}) - 可用于方法和类* @Documented - 包含在Javadoc中*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Documented
public @interface MyAnnotation {// 注解属性(类似接口中的抽象方法)String value() default ""; // 默认值为空字符串int priority() default 1;  // 默认优先级为1boolean enabled() default true; // 默认启用
}

在这里插入图片描述

2. 使用自定义注解

package com.example.annotation;
/*** 使用自定义注解的类** @MyAnnotation - 类级别的注解,使用默认值*/
@MyAnnotation
public class AnnotationDemo {private String name;/*** 使用自定义注解的方法** @MyAnnotation(value = "重要方法", priority = 2, enabled = true) - 方法级别的注解,指定了所有属性*/@MyAnnotation(value = "重要方法", priority = 2, enabled = true)public void doSomething(String param) {System.out.println("执行操作,参数: " + param);this.name = param;}/*** 未使用注解的方法*/public void doNothing() {System.out.println("什么也不做");}// Getter和Setterpublic String getName() {return name;}public void setName(String name) {this.name = name;}
}

在这里插入图片描述

3. 通过反射处理注解

package com.example.processor;import com.example.annotation.AnnotationDemo;
import com.example.annotation.MyAnnotation;import java.lang.reflect.Method;public class AnnotationProcessor {public static void main(String[] args) {// 获取AnnotationDemo类的Class对象Class<AnnotationDemo> demoClass = AnnotationDemo.class;// 1. 处理类级别的注解if (demoClass.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation classAnnotation = demoClass.getAnnotation(MyAnnotation.class);System.out.println("类注解信息:");System.out.println("  值: " + classAnnotation.value());System.out.println("  优先级: " + classAnnotation.priority());System.out.println("  是否启用: " + classAnnotation.enabled());}System.out.println("\n方法注解信息:");// 2. 处理方法级别的注解Method[] methods = demoClass.getDeclaredMethods();for (Method method : methods) {if (method.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);System.out.println("方法: " + method.getName());System.out.println("  值: " + methodAnnotation.value());System.out.println("  优先级: " + methodAnnotation.priority());System.out.println("  是否启用: " + methodAnnotation.enabled());// 如果方法有参数,可以进一步处理参数注解(本例中方法没有参数注解)// Class<?>[] parameterTypes = method.getParameterTypes();// Annotation[][] parameterAnnotations = method.getParameterAnnotations();}}}
}

在这里插入图片描述

4. 运行结果

运行 AnnotationProcessor 类,输出结果如下:
在这里插入图片描述

http://www.xdnf.cn/news/4744.html

相关文章:

  • C++回顾 Day4
  • 【Bootstrap V4系列】学习入门教程之 组件-轮播(Carousel)高级用法
  • 基于供热企业业务梳理的智能化赋能方案
  • 易境通散货拼柜系统:如何让拼箱货代协作效率翻倍?
  • 编程日志4.28
  • python23-函数返回值和参数处理,变量作用域
  • 记录学习的第三十五天
  • 2025-05-08-如何在一次 cmd 会话中批量设置多个 API key?
  • 英文论文查重笔记
  • 用3D slicer 去掉影像中的干扰体素而还原干净影像(脱敏切脸处理同)
  • 按拼音首字母进行排序组成新的数组(vue)
  • 强人工智能是否会诞生于现在的AI之中
  • 第二章 MySql
  • lc3341. 到达最后一个房间的最少时间 Ⅰ 算法解析
  • Red Hat linux环境openssh升级到openssh-10.0p1
  • FileInputStream
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(15):何と どういう
  • process-exporter服务安装并启动
  • 【C++游戏引擎开发】第32篇:物理引擎(Bullet)—约束系统
  • ollama+deepseek+openwebui安装
  • OrangePi Zero 3学习笔记(Android篇)2 - 第一个C程序
  • 创建需求跟踪矩阵5大常见步骤(附注意事项)
  • linux - shell脚本编程
  • 解锁 AI 生产力:Google 四大免费工具全面解析20250507
  • vue3+ts的watch全解!
  • 登顶中国:基于 Trae AI与 EdgeOne MCP 的全国各省最高峰攀登攻略博客构建实践
  • 比较入站和出站防火墙规则
  • 使用Apache Spark在Java中进行日志分析
  • 如何快速获取旺店通奇门原始数据至本地
  • 掌握Multi-Agent实践(二):基于AgentScope构建支持@机制的群聊系统,实现定向对话机制