Java_注解

1. 简介

在Java中,注解(Annotation)是一种元数据形式,它为代码添加了额外的信息,这些信息可以被编译器、工具、框架或运行时环境使用。注解提供了一种声明性的方式来向程序中添加元数据,而不需要修改程序的实际逻辑。


2. Java中常见的注解

2.1 内建注解(Built-in Annotations)

  • @Override: 用于标识一个方法覆盖了父类中的方法。
  • @Deprecated: 用于标识已过时的方法或类,表示不再推荐使用。
  • @SuppressWarnings: 抑制编译器产生警告信息。

2.2 元注解(Meta-Annotations)

  • @Target: 指定注解的应用范围,可以是类、方法、字段等。
    该注解的ElementType枚举值:

    ElementType.ANNOTATION_TYPE//表示该注解可以应用在其他注解上。ElementType.CONSTRUCTOR//表示该注解可以应用在构造方法上。ElementType.FIELD//表示该注解可以应用在字段(属性)上。ElementType.LOCAL_VARIABLE//表示该注解可以应用在局部变量上。ElementType.METHOD//表示该注解可以应用在方法上。ElementType.PACKAGE//表示该注解可以应用在包上。ElementType.PARAMETER//表示该注解可以应用在参数上。ElementType.TYPE//表示该注解可以应用在类、接口(包括注解类型)、枚举上。
    
  • @Retention: 指定注解的保留策略,可以是源代码、编译时期或运行时期。

    • RetentionPolicy.SOURCE
      表示注解仅存在于源代码中,在编译时会被丢弃,不会保留在编译生成的字节码文件中。这意味着这种类型的注解在运行时是不可见的。

    • RetentionPolicy.CLASS
      表示注解存在于编译生成的字节码文件中,但在运行时不可见。这是默认的保留策略,如果在 @Retention 中不显式指定,默认是 RetentionPolicy.CLASS。

    • RetentionPolicy.RUNTIME
      表示注解在运行时是可见的,可以通过反射等机制获取注解信息。这种保留策略允许在运行时通过反射来处理注解。

  • @Documented: 表示注解将包含在JavaDoc中。

  • @Inherited: 表示注解可以被子类继承

2.3 自定义注解

定义示例:

// 定义一个自定义注解
public @interface MyAnnotation {String value() default ""; // 注解元素,默认值为空字符串int count() default 0; //定义了一个名称为 count, 类型为int, 默认值为0的 注解元素
}

使用示例:

@MyAnnotation(value = "Hello", count = 5)
public class MyClass {// 类的内容
}

3. 获取注解信息

仅在 @Retention(RetentionPolicy.RUNTIME) 时使用

3.1 获取类注解信息

import java.lang.annotation.*;// 定义自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {String value() default "";int count() default 0;
}// 使用自定义注解
@MyAnnotation(value = "Hello", count = 5)
public class MyClass {public static void main(String[] args) {// 获取类上的注解MyAnnotation annotation = MyClass.class.getAnnotation(MyAnnotation.class);// 判断注解是否存在if (annotation != null) {// 访问注解中的元素值String value = annotation.value();int count = annotation.count();// 打印注解中的信息System.out.println("Value: " + value);System.out.println("Count: " + count);} else {System.out.println("MyAnnotation is not present on MyClass.");}}
}

3.2 获取方法的注释信息

定义注解

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyMethodAnnotation {String value() default "";int count() default 0;
}

使用注解

public class MyClass {@MyMethodAnnotation(value = "Hello Method", count = 10)public void myMethod() {// 方法的内容}
}

获取注解信息

import java.lang.reflect.Method;public class AnnotationExample {public static void main(String[] args) {// 获取类的Class对象Class<MyClass> myClassClass = MyClass.class;try {// 获取方法的Method对象Method method = myClassClass.getMethod("myMethod");// 获取方法上的注解MyMethodAnnotation methodAnnotation = method.getAnnotation(MyMethodAnnotation.class);// 判断注解是否存在if (methodAnnotation != null) {// 访问注解中的元素值String value = methodAnnotation.value();int count = methodAnnotation.count();// 打印注解中的信息System.out.println("Value: " + value);System.out.println("Count: " + count);} else {System.out.println("MyMethodAnnotation is not present on myMethod.");}} catch (NoSuchMethodException e) {e.printStackTrace();}}
}

3.3 获取属性的注解信息

定义注解

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyFieldAnnotation {String value() default "";int count() default 0;
}

使用注解

public class MyClass {@MyFieldAnnotation(value = "Hello Field", count = 20)private String myField;// 其他类内容...
}

获取注解信息

import java.lang.reflect.Field;public class AnnotationExample {public static void main(String[] args) {// 获取类的Class对象Class<MyClass> myClassClass = MyClass.class;try {// 获取字段的Field对象Field field = myClassClass.getDeclaredField("myField");// 获取字段上的注解MyFieldAnnotation fieldAnnotation = field.getAnnotation(MyFieldAnnotation.class);// 判断注解是否存在if (fieldAnnotation != null) {// 访问注解中的元素值String value = fieldAnnotation.value();int count = fieldAnnotation.count();// 打印注解中的信息System.out.println("Value: " + value);System.out.println("Count: " + count);} else {System.out.println("MyFieldAnnotation is not present on myField.");}} catch (NoSuchFieldException e) {e.printStackTrace();}}
}

getDeclaredField 方法的参数是字段的名称。如果字段是私有的,还需要通过field.setAccessible(true) 开启对私有字段的访问权限

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

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

相关文章

Harmony Ble蓝牙App(二)连接与发现服务

Ble蓝牙App&#xff08;二&#xff09;连接与发现服务 前言正文一、BlePeripheral回调二、连接和断连三、连接状态回调四、发现服务五、服务提供者六、显示服务七、源码 前言 在上一篇中我们进行扫描设备的处理&#xff0c;本文中进行连接和发现服务的数据处理&#xff0c;运行…

Mysql数据库 18.Mysql SQL优化

SQL优化 一、插入优化 多条插入语句&#xff0c;影响执行效率 优化方案 1、批量插入&#xff1a; 在一条insert语句中多条数据&#xff0c;但是如果数据量过大&#xff0c;也不能完全使用一条语句语句&#xff0c;建议数据量为一次性插入1000条以下的数据 如果数据量多大&…

plantUML学习与实战

背景 在日常工作或者生活中&#xff0c;使用交互图来描述想法&#xff0c;往往相对于文字来说&#xff0c;可读性更高&#xff0c;同时一定程度上可以提高沟通效率&#xff0c;但是苦于&#xff0c;不想对一堆控件拖拖拉拉&#xff0c;本人就是一个很讨厌画图&#xff0c;但是…

【华为OD题库-036】跳格子2-java

题目 小明和朋友玩跳格子游戏&#xff0c;有n个连续格子组成的圆圈&#xff0c;每个格子有不同的分数&#xff0c;小朋友可以选择从任意格子起跳&#xff0c;但是不能跳连续的格子&#xff0c;不能回头跳&#xff0c;也不能超过一圈:给定一个代表每个格子得分的非负整数数组&am…

Python---把函数的返回值作为另外一个函数的参数

def test1():return 50def test2(num):print(num)# 1. 保存函数test1的返回值 result test1()# 2.将函数返回值所在变量作为参数传递到test2函数 test2(result) # 50

数据结构 栈和队列的应用

在昨天分享了有关栈和队列的基础知识和基本操作后&#xff0c;今天来分享一些有关栈和队列的应用 栈和队列的应用 删除字符串中的所有相邻重复项 #include <iostream> #include <stack> using namespace std; string remove(string S) {stack<char> charS…

MySql表中添加emoji表情

共五处需要修改。 语句执行修改&#xff1a; ALTER TABLE xxxxx CONVERT TO CHARACTER SET utf8mb4;

微型计算机原理MOOC题

一、8254 1.掉坑了&#xff0c;AL传到端口不意味着一定传到的是低位&#xff0c;要看控制字D5和D4&#xff0c;10是只写高位&#xff0c;所以是0A00.。。 2. 3. 4.待解决&#xff1a;

优化C++资源利用:探索高效内存管理技巧

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 我们之前在C语言中学习过动态内存开辟&#xff0c;使用malloc、calloc与realloc进行开辟&#xff0c;使用free进行堆上内存的释放。进入C后对于动态内存开辟我们又有了新的内容new与dele…

CCC联盟——UWB MAC(一)

本文在前面已经介绍了相关UWB的PHY之后&#xff0c;重点介绍数字钥匙&#xff08;Digital Key&#xff09;中关于MAC层的相关实现规范。由于MAC层相应涉及内容比较多&#xff0c;本文首先从介绍UWB MAC的整体框架&#xff0c;后续陆续介绍相关的网络、协议等内容。 1、UWB MAC架…

真心的表扬与鼓励,胜过一万句说教

今天我想和大家分享一下&#xff0c;怎样跟孩子运用鼓励和表扬。我记得鲁道夫德雷克斯是阿德勒学派的心理学家&#xff0c;也是来自《孩子的挑战》一书的作者&#xff0c;他说孩子们需要鼓励&#xff0c;就像植物需要水&#xff0c;鼓励能让孩子知道自己做的事与自己是什么样的…

非自定义Bean注解开发Bean配置类的注解开发

目录 非自定义Bean注解开发 Bean配置类的注解开发 非自定义Bean注解开发 非自定义的Bean不能像自定义Bean使用Component进行管理&#xff0c;非自定义Bean要通过工厂的方式进行实例化&#xff0c;使用Bean标注方法即可&#xff0c;Bean的属性文beanName 如果Bean工厂方法需要参…

[23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution

paper | proj | code 提出一种基于K-Planes的4D point cloud Representation&#xff1b;提出一种Hybrid appearance model&#xff0c;包含image blending model和SH model。其中&#xff0c;image blending model将3D点映射回原图中求得&#xff0c;SH model通过模型预测求得…

【工具栏】热部署不生效

目录 配置热部署&#xff1a; 解决热部署不生效&#xff1a; 首先检查&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 配置热部署&#xff1a; https://blog.csdn.net/m0_67930426/article/details/133690559 解决热部署不…

Python中的解析器argparse

import argparse## 构造解析器 argparse.ArgumentParser() parse argparse.ArgumentParser(description"caculateing the area of rectangle")## 添加参数 .add_argument() parse.add_argument("--length",typeint,default20,helpThe length of rectangle…

【追求卓越09】算法--散列表(哈希表)

引导 通过前面几个章节的学习&#xff08;二分查找&#xff0c;跳表&#xff09;&#xff0c;我们发现想要快速查找某一个元素&#xff0c;首先需要将所有元素进行排序&#xff0c;再利用二分法思想进行查找&#xff0c;复杂度是O(logn)。有没有更快的查找方式呢&#xff1f; 本…

微软发布最新.NET 8长期支持版本,云计算、AI应用支持再强化

11 月 15 日开始的为期三天的 .NET Conf 在线活动的开幕日上&#xff0c;.NET 8作为微软的开源跨平台开发平台正式发布。.NET 团队着重强调云、性能、全栈 Blazor、AI 和 .NET MAUI 是.NET 8的主要亮点。.NET团队在 .NET Conf 2023 [1]活动开幕式上表示&#xff1a;“通过这个版…

nginx 模块相关配置及结构理解

文章目录 模块配置结构模块配置指令先看一下 ngx_command_t 结构一个模块配置的demo简单模块配置的案例演示 模块上下文结构模块的定义 模块配置结构 Nginx中每个模块都会提供一些指令&#xff0c;以便于用户通过配置去控制该模块的行为。 Nginx的配置信息分成了几个作用域(sc…

使用注解的AOP编程

使用注解的AOP编程 当注解没有参数时 当使用注解进行面向切面编程&#xff08;AOP&#xff09;时&#xff0c;你可以按照以下步骤来实现&#xff1a; 步骤&#xff1a; 1. 创建自定义注解&#xff1a; 首先&#xff0c;创建自定义的注解&#xff0c;以便在代码中标记需要进…

Excel换不了行怎么解决?

方法一: 使用Alt Enter键 在Excel中&#xff0c;输入文字时按下回车键&#xff0c;光标将会移到下一个单元格&#xff0c;如果想要换行&#xff0c;可以尝试使用Alt Enter键。具体操作如下: 1.在单元格中输入文字; 2.想要换行时&#xff0c;在需要换行的位置按下Alt Enter键; 3…