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

功能篇:JAVA实现自定义注解

在Java中创建自定义注解可以通过使用`@interface`关键字来完成。自定义注解可以包含元素(即参数),并且你可以指定这些元素的默认值、保留策略以及应用的目标。以下是实现自定义注解的基本步骤和示例代码。

### 自定义注解的组成部分

1. **元素(成员)**:注解可以有零个或多个元素,它们类似于方法声明,但没有方法体。每个元素必须有一个默认值或者在使用时提供具体的值。
2. **默认值**:可以为注解的元素设置默认值,这样在使用该注解时可以省略这些元素。
3. **元注解**:用于描述注解的注解称为元注解。常用的元注解包括:
   - `@Retention`:定义了该注解的生命周期。
   - `@Target`:定义了该注解可以应用于哪些程序元素。
   - `@Documented`:表明该注解应该被javadoc工具记录。
   - `@Inherited`:表明该注解可以被子类继承。
4. **保留策略 (`RetentionPolicy`)**
   - `SOURCE`:注解仅存在于源代码级别,在编译时会被丢弃。
   - `CLASS`:注解会在class文件中存在,但在运行时不会被虚拟机保留。
   - `RUNTIME`:注解会在运行时由虚拟机保留,因此可以通过反射机制读取。

### 示例代码

#### 1. 创建自定义注解

```java
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, ElementType.TYPE })
public @interface CustomAnnotation {
    // 注解的元素
    String value() default "Default Value"; // 默认值
    int id() default -1; // 可选元素,带默认值
    String[] tags() default {}; // 数组类型的元素,默认为空数组
}
```

#### 2. 使用自定义注解

接下来,你可以在类或方法上使用这个自定义注解:

```java
@CustomAnnotation(value = "This is a custom annotation", id = 1001, tags = {"tag1", "tag2"})
public class MyClass {

    @CustomAnnotation("Method level annotation")
    public void myMethod() {
        System.out.println("Executing method with custom annotation.");
    }
}
```

#### 3. 通过反射获取注解信息

为了在运行时处理自定义注解,你需要使用Java的反射API。下面是一个简单的例子,展示了如何读取并打印出类和方法上的自定义注解信息:

```java
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class AnnotationProcessor {

    public static void main(String[] args) throws Exception {
        Class<?> clazz = MyClass.class;

        // 检查类级别的注解
        if (clazz.isAnnotationPresent(CustomAnnotation.class)) {
            CustomAnnotation classAnnotation = clazz.getAnnotation(CustomAnnotation.class);
            printAnnotationInfo(classAnnotation, "Class");
        }

        // 检查方法级别的注解
        for (Method method : clazz.getDeclaredMethods()) {
            if (method.isAnnotationPresent(CustomAnnotation.class)) {
                CustomAnnotation methodAnnotation = method.getAnnotation(CustomAnnotation.class);
                printAnnotationInfo(methodAnnotation, "Method: " + method.getName());
            }
        }
    }

    private static void printAnnotationInfo(CustomAnnotation annotation, String prefix) {
        System.out.println(prefix + " - Value: " + annotation.value());
        System.out.println(prefix + " - ID: " + annotation.id());
        System.out.print(prefix + " - Tags: ");
        for (String tag : annotation.tags()) {
            System.out.print(tag + " ");
        }
        System.out.println();
    }
}
```

这段代码会输出所有带有`CustomAnnotation`注解的类和方法的信息。请注意,为了访问运行时注解,必须确保注解的保留策略是`RUNTIME`。

通过这种方式,你可以根据需要创建各种各样的自定义注解,并利用它们来增强代码的功能性和可读性。


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

相关文章:

  • CTFshow—文件包含
  • Elixir语言的学习路线
  • 在 macOS 中,设置自动将文件夹排在最前
  • 计算机网络 (23)IP层转发分组的过程
  • Nginx:Stream模块
  • 【生物信息】如何使用 h5py 读取 HDF5 格式文件中的数据并将其转换为 NumPy 数组
  • 记账管理系统网页版
  • UTONMOS解读元宇宙惊艳应用案例
  • python将字符串类型的字典以json格式保存到数据库教程
  • 【算法】数组中,求K个最大值
  • Advanced Functional Materials 光驱动连续跳跃机器人
  • SpringBoot【二】yaml、properties两配置文件介绍及使用
  • yocto的xxx.bb文件在什么时候会拷贝文件到build目录
  • Java设计模式 —— 【创建型模式】建造者模式详解
  • 鸿蒙 Next 可兼容运行 Android App,还支持出海 GMS?
  • VLM-OCR-Demo:一个使用VLM用于OCR任务的示例
  • Java 设计模式~工厂模式
  • 工业—使用Flink处理Kafka中的数据_EnvironmentData2
  • 【爬虫】– 抓取原创力文档数据
  • Python 类的设计(以植物大战僵尸为例)
  • 3D Gaussian Splatting代码详解(一):模型训练、数据加载
  • 单片机 PCB 设计要点
  • 数据结构(Queue队列)
  • Linux:network:添加ip的时候自动添加一个本地路由
  • 针对一个系统的权限管理这样的业务场景,使用各设计模式解说
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-augment.py