21xrx.com
2024-09-08 09:59:55 Sunday
登录
文章检索 我的文章 写文章
Java自定义注解详解及实战案例
2023-06-15 11:45:35 深夜i     --     --
Java 自定义注解 反射

Java注解是一种元数据,它为我们提供了在程序元素(类、方法、字段等)上添加注释信息的方式。这些注释信息可以用于编译器、IDE、框架、运行时等多个场景。Java中常见的注解有 Override、Deprecated、SuppressWarnings等。

除了使用Java自带注解以外,我们还可以使用Java提供的元注解(即注解的注解)来自定义注解。通过自定义注解,我们可以实现自己所需的一些功能、规范等。下面我们来演示一个通过自定义注解来进行参数校验的示例。

首先定义一个注解类,我们可以通过@Target注解指定注解所适用的程序元素,如方法、类等,这里我们将注解作用在方法上;通过@Retention注解指定注解的生命周期,默认为CLASS(即在编译阶段保留,但不会加载到运行时环境中),我们设置为RUNTIME(在运行时环境中保留);通过@Documented注解指定注解是否被包含在JavaDoc中,这里我们将其设置为true。


import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface CheckParam {

  String value();

}

然后定义一个使用该注解的方法:


public class Test {

  @CheckParam("number")

  public static void checkNumber(int num) {

    if (num <= 0) {

      throw new IllegalArgumentException("num should be greater than 0");

    }

    System.out.println(num);

  }

}

接下来,我们可以通过反射机制获取该方法,并对其使用到的注解进行解析,以达到对参数的校验:


public class Main {

  public static void main(String[] args) throws Exception {

    Method method = Test.class.getDeclaredMethod("checkNumber", int.class);

    CheckParam checkParam = method.getAnnotation(CheckParam.class);

    if (checkParam != null) {

      int index = 0;

      Object[] params = new Object[1];

      for (Annotation[] annotations : method.getParameterAnnotations()) {

        for (Annotation annotation : annotations) {

          if (annotation instanceof CheckParam) {

            CheckParam param = (CheckParam) annotation;

            if (param.value().equals("number")) {

              int num = Integer.parseInt(args[index]);

              Test.checkNumber(num);

              params[index++] = num;

            }

          }

        }

      }

    }

  }

}

上面的代码中,我们首先获取了方法对象,然后通过getMethodAnnotation()方法获取@CheckParam注解对象。接着,我们通过getParameterAnnotations()方法获取参数上的所有注解,通过遍历注解数组,可以找到我们自定义的@CheckParam注解,在这里我们匹配其value属性值,如果是"number",就对参数进行校验。最后调用方法的时候,将检验通过的参数传入即可。

通过上面的示例,我们可以初步了解Java自定义注解的使用方法及其实现原理。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复