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

【Java注解】

Java注解(Annotation)让其他程序根据注解信息来决定怎么执行该程序。

是Java 5中引入的一种特殊类型的注释,它可以被用来为代码添加元数据,即关于代码的数据。

注解不会改变程序的逻辑,但它们可以被其他程序使用,比如编译器、开发工具或其他可以在运行时分析注解的代码。

注解的定义

注解通过 @interface 关键字来定义。下面是一个简单的注解定义:

public @interface SimpleAnnotation {
    // 定义注解的属性(元素)
    public 属性类型 属性名() default 默认值;
}

注解元素的类型可以是基本类型、String、枚举、注解类型或这些类型的数组。

为什么要使用注解

使用注解可以:

  1. 提供信息给编译器:例如,@Override注解告诉编译器某个方法是重写了父类中的方法。
  2. 为运行时处理提供信息:例如,通过反射机制读取注解信息,然后根据这些信息执行特定的逻辑。
  3. 减少配置文件的使用:传统的配置方式可能需要大量的XML或属性文件,而注解可以在代码中直接提供配置信息。

自定义注解

注解可以用来修饰包、类、接口、方法、字段、构造器、局部变量等。

定义自定义注解 

格式:

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

例子:

public @interface MyAnnotation {  
    // 定义了一个名为value的元素,它是String类型,有默认值"Hello"  
    String value() default "Hello";  
  
    // 定义了一个名为id的元素,它是int类型,没有默认值  
    int id();  
}

使用自定义注解

使用自定义注解非常简单,只需要在需要的地方(如类、方法、字段等)前面加上@符号和注解名,并为其元素指定值(如果有需要的话)。

@MyAnnotation(value = "World", id = 123)  
public class MyClass {  
    @MyAnnotation(id = 456) // 注意这里省略了value,因为它有默认值  
    public void myMethod() {  
        // 方法体  
    }  
}

特殊属性名:value

单一值注解:当注解只包含一个名为value的元素时,在使用注解时可以省略属性名和等号。这意味着你可以直接在括号内提供值。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SimpleAnnotation {
    String value(); // 唯一的属性名为value
}

注解的原理 

本质

特殊类型的接口

  • 定义方式:注解使用@interface关键字来定义,这看起来类似于接口的定义,但实际上它们是一种特殊的接口,专门用于提供元数据。
  • 无实现方法:注解中定义的方法(称为元素)都是无参数的,并且这些方法实际上并不包含实现代码,它们只是用于声明注解的属性。

元数据

  • 作用:注解提供了一种形式化的方法来描述类、方法、变量等构成成分的额外信息,这些信息被称为元数据。
  • 用途:元数据可以用于多种目的,如生成文档、编译检查、代码分析等。

元注解

  • 定义注解的注解:元注解用于控制注解的行为,如指定注解可以应用的Java元素类型(@Target)、注解的保留策略(@Retention)、是否将注解包含在Javadoc中(@Documented)以及是否允许子类继承父类中的注解(@Inherited)。

注解解析 

这里我将通过一个简单的例子来说明如何在运行时通过反射读取注解信息。

首先,定义一个注解:

import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
  
@Retention(RetentionPolicy.RUNTIME) // 注解保留在运行时,以便可以通过反射读取  
@Target({ElementType.METHOD}) // 注解可以应用于方法上  
public @interface MyAnnotation {  
    String value() default "default value"; // 注解有一个名为value的元素,带有默认值  
}

 然后,创建一个使用该注解的类:

public class MyClass {  
  
    @MyAnnotation(value = "Hello, World!")  
    public void myMethod() {  
        // 方法体  
    }  
}

最后,通过反射来解析注解:

import java.lang.reflect.Method;  
  
public class AnnotationReader {  
    public static void main(String[] args) throws NoSuchMethodException {  
        // 获取MyClass类的Class对象  
        Class<?> clazz = MyClass.class;  
  
        // 获取名为"myMethod"的方法  
        Method method = clazz.getDeclaredMethod("myMethod");  
  
        // 检查该方法是否被MyAnnotation注解  
        if (method.isAnnotationPresent(MyAnnotation.class)) {  
            // 获取注解实例  
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);  
  
            // 读取注解中的value值  
            System.out.println(annotation.value()); // 输出: Hello, World!  
        }  
    }  
}

在上面的例子中,我们首先定义了一个名为MyAnnotation的注解,它有一个名为value的元素,并默认值为"default value"。然后,我们在MyClass类的一个方法myMethod上使用了这个注解,并指定了value的值为"Hello, World!"。最后,我们通过反射机制在AnnotationReader类中获取了MyClass类的myMethod方法,并检查了该方法是否被MyAnnotation注解。如果该方法被注解,我们就获取注解的实例,并读取了value的值。

这个例子展示了如何在运行时通过反射来解析和处理注解信息。当然,注解的应用远不止于此,它们可以用于生成代码、编译时检查、测试等多种场景。


http://www.kler.cn/a/314576.html

相关文章:

  • scala学习记录,Set,Map
  • 【mongodb】数据库的安装及连接初始化简明手册
  • 当财政支持减弱时,国有企业如何实现降本增效?
  • Python布局
  • 数据挖掘(十)
  • 华为eNSP:mux-vlan
  • Docker指令学习1
  • 【Kubernetes】常见面试题汇总(二十七)
  • 【网络安全 | 代码审计】PHP无参数RCE
  • 从图像处理到字符识别:基于STM32与C语言的车牌识别系统实现
  • HarmonyOS开发者基础认证考试试题
  • 基于mockito做单元测试
  • 16【Protues51单片机仿真】智能洗衣机倒计时系统
  • 【如何在 Windows 10 主机上通过 VMware 安装 Windows 11 虚拟机,并共享主机网络】
  • ftp服务的管理及安全优化
  • Google 扩展 Chrome 安全和隐私功能
  • C/C++通过CLion2024进行Linux远程开发保姆级教学
  • io多路复用:epoll水平触发(LT)和边沿触发(ET)的区别和优缺点
  • Linux 自旋锁
  • Spring Mybatis 动态语句 总结
  • 简单生活的快乐
  • (k8s)kubernetes集群基于Containerd部署
  • Flask-SQLAlchemy一对多 一对一 多对多关联
  • GDPU Andriod移动应用 Activity
  • 【数据结构与算法】LeetCode:哈希表
  • Alinx MPSoC驱动开发第17章I2C实验修改设备树后petalinux编译报错