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

Java注解详解

概述

注解是对程序代码进行标注和解释的一种方式。在Java中,注解提供了一种元数据形式,能够在程序中嵌入有关程序的信息,以便进行进一步的处理。注解通过使用@符号来声明,如@Override@Deprecated等。

注解和注释的区别

  • 注释:是给程序员看的,不会对程序产生任何影响。
  • 注解:是给编译器或其他工具看的,可以在编译、运行时进行一些特殊操作。

使用注解进行配置的优势

使用注解进行配置能使代码更简洁、方便,而不再需要繁琐的配置文件。注解能够直观地标识出程序中的关键信息,提高代码的可读性和可维护性。

自定义注解

格式

javaCopy codepublic @interface 注解名称 {public 属性类型 属性名() default 默认值;
}

属性类型

  • 基本数据类型
  • String
  • Class
  • 注解
  • 枚举
  • 以上类型的一维数组

示例代码

javaCopy codepublic @interface Anno2 {
}public enum Season {SPRING, SUMMER, AUTUMN, WINTER;
}public @interface Anno1 {// 定义一个基本类型的属性int a() default 23;// 定义一个String类型的属性String name() default "shizhanban";// 定义一个Class类型的属性Class clazz() default Anno2.class;// 定义一个注解类型的属性Anno2 anno() default @Anno2;// 定义一个枚举类型的属性Season season() default Season.SPRING;// 以上类型的一维数组// int数组int[] arr() default {1, 2, 3, 4, 5};// 枚举数组Season[] seasons() default {Season.SPRING, Season.SUMMER};// value。后期我们在使用注解的时候,如果我们只需要给注解的value属性赋值。// 那么value就可以省略String value();
}// 在使用注解的时候如果注解里面的属性没有指定默认值。
// 那么我们就需要手动给出注解属性的设置值。
//@Anno1(name = "shizhanban")
@Anno1("abc")
public class AnnoDemo {
}

注意

如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。

自定义注解案例

需求

自定义一个注解@Test,用于指定类的方法上,如果某一个类的方法上使用了该注解,就执行该方法。

实现步骤

  1. 自定义一个注解Test,并在类的某几个方法上加上注解。
  2. 在测试类中,获取注解所在类的Class对象。
  3. 获取类中所有的方法对象。
  4. 遍历每一个方法对象,判断是否有对应的注解。
javaCopy code// 表示Test这个注解的存活时间
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Test {
}public class UseTest {// 没有使用Test注解public void show() {System.out.println("UseTest....show....");}// 使用Test注解@Testpublic void method() {System.out.println("UseTest....method....");}// 没有使用Test注解@Testpublic void function() {System.out.println("UseTest....function....");}
}public class AnnoDemo {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {// 1.通过反射获取UseTest类的字节码文件对象Class clazz = Class.forName("com.shizhanban.UseTest");// 创建对象UseTest useTest = (UseTest) clazz.newInstance();// 2.通过反射获取这个类里面所有的方法对象Method[] methods = clazz.getDeclaredMethods();// 3.遍历数组,得到每一个方法对象for (Method method : methods) {// method依次表示每一个方法对象。// isAnnotationPresent(Class<? extends Annotation> annotationClass)// 判断当前方法上是否有指定的注解。// 参数:注解的字节码文件对象// 返回值:布尔结果。  true 存在  false 不存在if (method.isAnnotationPresent(Test.class)) {method.invoke(useTest);}}}
}

元注解

概述

元注解是描述注解的注解。

元注解介绍

  • @Target:指定了注解能在哪里使用。
  • @Retention:可以理解为保留时间(生命周期)。
  • @Inherited:表示修饰的自定义注解可以被子类继承。
  • @Documented:表示该自定义注解会出现在API文档里面。

示例代码

javaCopy code@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) // 指定注解使用的位置(成员变量,类,方法)
@Retention(RetentionPolicy.RUNTIME) // 指定该注解的存活时间
// @Inherited // 指定该注解可以被继承
public @interface Anno {
}@Anno
public class Person {
}public class Student extends Person {public void show() {System.out.println("student.......show..........");}
}public class StudentDemo {public static void main(String[] args) throws ClassNotFoundException {// 获取到Student类的字节码文件对象Class clazz = Class.forName("com.shizhanban.Student");// 获取注解。boolean result = clazz.isAnnotationPresent(Anno.class);System.out.println(result);}
}

通过元注解,我们可以更加灵活地定义和使用自定义注解,控制注解的生命周期和作用范围。

http://www.lryc.cn/news/257678.html

相关文章:

  • Android wifi 框架以及Enable流程
  • 十五、机器学习进阶知识:K-Means聚类算法
  • 软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位
  • 搭乘“低代码”快车,引领食品行业数字化转型全新升级
  • Axure->Axure安装,Axure菜单栏和工具栏功能介绍,页面及概要区
  • 【BUG】微信小程序image不会随着url动态变化
  • 供应链管理痛点大解析!内附解决方案
  • 【Python深度学习第二版】学习笔记之——神经网络
  • 计算机视觉之手势、面部、姿势捕捉以Python Mediapipe为工具
  • 基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(一)——创建Glue
  • Vue学习计划-Vue2--VueCLi(二)vuecli脚手架创建的项目内部主要文件分析
  • spring boot项目如何自定义参数校验规则
  • springboot整合xxl-job,通过代码进行调度中心注册开启任务等
  • k8s集群部分使用gpu资源的pod出现UnexpectedAdmissionError问题
  • 自定义 el-select 和 el-input 样式
  • 解决本地centos虚拟机重启,自动变换 ip 地址的问题
  • pt36项目短信OAth2.0
  • 教师们如何一对一私发成绩?
  • 12.11
  • Spring JdbcTemplate
  • 力扣编程题算法初阶之双指针算法+代码分析
  • 实现安装“自由化”!在Windows 11中如何绕过“您尝试安装的应用程序未通过微软验证”
  • 【mysql】下一行减去上一行数据、自增序列场景应用
  • CLIP在Github上的使用教程
  • 入职字节外包一个月,我离职了。。。
  • SpringBoot的web开发
  • 传染病传播速度
  • 前端打包环境配置步骤
  • css的4种引入方式--内联样式(标签内style)、内部样式表(<style>)、外部样式表(<link>、@import)
  • GPT-4 变懒了?官方回复