Java的自定义注解

java元注解和自定义注解的区别

Java的自定义注解是一种元数据,可以应用于类、方法、字段等程序元素上,以提供额外的信息或指示。

        自定义注解包括注解声明、元注解、运行时处理器三个部分。注解声明指定了注解的名称、作用域、成员等信息;元注解则用来对注解进行修饰;运行时处理器则负责在程序运行过程中处理注解,并根据注解提供的信息执行相应的逻辑。自定义注解在编写框架、插件等开发时非常常见,可以为代码提供更多的灵活性和可扩展性

自定义注解类可以通过以下步骤使用:

  1. 定义注解类,指定注解的元素和属性。

  2. 在需要使用注解的地方,使用@注解名称来标注目标元素,可以是类、方法、字段等程序元素。

  3. 可以使用反射机制获取注解,并对注解进行处理。

例如,定义一个自定义注解类:

import java.lang.annotation.*;
/**
 * @Description
 * @Author 刘品水
 * @Data 2023/5/5 18:44
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation {
    String value() default "";
    int num() default 0;
}

然后在代码中使用该注解:

/**
 * @Description
 * @Author 刘品水
 * @Data 2023/5/5 18:44
 */
@MyAnnotation(value = "Hello 阿水!", num = 1314)
public class MyClass {
    @MyAnnotation("阿水")
    private String name;

    @MyAnnotation(num = 666,value = "闻道有先后,术业有专攻~")
    public void myMethod() {
        // Do something you want to do!
    }

    @MyAnnotation(value = " ")
    public void myMethod2() {
        // Do something you want to do!
    }
}

可以通过反射获取注解并处理:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Description
 * @Author 刘品水
 * @Data 2023/5/5 18:46
 */
public class MyTest {
    public static void main(String[] args) throws Exception {
        // 获取类上的注解
        MyAnnotation classAnnotation = MyClass.class.getAnnotation(MyAnnotation.class);
        System.out.println("获取类上的注解value值:"+classAnnotation.value()); // 输出:Hello 阿水!
        System.out.println("获取类上的注解num值:"+classAnnotation.num()); // 输出:1314

        // 获取字段上的注解
        Field field = MyClass.class.getDeclaredField("name");
        MyAnnotation fieldAnnotation = field.getAnnotation(MyAnnotation.class);
        System.out.println("获取类上的注解value值:"+fieldAnnotation.value()); // 输出:阿水
        System.out.println("获取类上的注解num值:"+fieldAnnotation.num()); // 输出:0

        // 获取方法上的注解
        Method method = MyClass.class.getDeclaredMethod("myMethod");
        MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);
        System.out.println("获取myMethod方法上的注解value值:"+methodAnnotation.value()); // 输出:闻道有先后,术业有专攻~
        System.out.println("获取myMethod方法上的注解num值:"+methodAnnotation.num()); // 输出:666

        // 获取方法上的注解
        Method method2 = MyClass.class.getDeclaredMethod("myMethod2");
        MyAnnotation methodAnnotation2 = method2.getAnnotation(MyAnnotation.class);
        System.out.println("获取myMethod2方法上的注解value值:"+methodAnnotation2.value()); // 输出:
        System.out.println("获取myMethod2方法上的注解num值:"+methodAnnotation2.num()); // 输出:0

    }
}

注意:自定义注解类必须要有@Retention和@Target元注解,@Retention指定注解的保留策略,@Target指定注解可以应用到哪些元素上。在这里,我们使用RUNTIME保留策略表示注解在运行时仍然有效,并且使用TYPE和METHOD作为注解的目标元素。

Java自定义注解类使用注意事项

        在使用Java自定义注解类时,需要注意以下几点:

  1. 注解元素类型:自定义注解中的元素类型必须是基本数据类型、String、Class、枚举类型或者其他注解类型。

  2. 注解属性默认值和赋值:自定义注解中的属性可以设置默认值,但在使用注解时可以不指定该属性的值。如果需要给属性赋值,则必须按照属性名=属性值的格式进行赋值。

  3. 自定义注解可以使用反射机制来获取和处理,因此要保证注解中的元素符合Java语言规范,不会导致编译错误。

  4. 可以使用元注解@Retention和@Target来指定注解的保留策略和目标范围。一般情况下,@Retention应该设置为RUNTIME,@Target应该根据需要选择适当的目标类型。

  5. 在使用注解时,应该遵循注解的语法规则,即使用 "@" 符号后跟着注解名称,并在括号中指定注解属性和值。如果需要使用多个注解,则可以将它们放在同一个目标元素上,或者使用Java 1.8新增的@Repeatable注解。

        总之,在使用Java自定义注解时,需要遵守Java语法规范和注解的语法规则,注意注解元素类型、属性默认值和赋值、保留策略、目标类型等细节问题,才能保证注解的正确性和有效性。同时也需要理解注解的原理和机制,才能更好地应用自定义注解处理程序逻辑。

猜你喜欢

转载自blog.csdn.net/lps12345666/article/details/130512217