Java反射 获取/修改注解

Java反射提供了获取和修改类、方法、字段等元素的注解信息的方法,通过这些方法可以获取注解的属性值,或者在运行时修改注解的属性值。

注解是Java中的一种特殊的接口类型,用于描述类、方法、字段等元素的属性。注解是以@符号为前缀的修饰符,可以加在类、方法、变量等前面。Java反射提供了Annotation类来表示注解类型。

下面是获取类的注解信息的示例代码:

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public class ReflectAnnotationDemo {

    @Deprecated
    public String field;

    public static void main(String[] args) {
        Class<?> clazz = ReflectAnnotationDemo.class;
        Annotation[] annotations = clazz.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }

        Field field = null;
        try {
            field = clazz.getField("field");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        Annotation[] fieldAnnotations = field.getAnnotations();
        for (Annotation annotation : fieldAnnotations) {
            System.out.println(annotation);
        }
    }
}

在上面的示例中,我们使用Class类的getAnnotations()方法获取了类的所有注解信息,并通过遍历Annotation数组输出了注解信息。

另外,我们还使用了Field类的getAnnotations()方法获取了类中某个字段的注解信息。

如果需要修改注解信息,可以通过Java反射提供的方法来实现。以下是修改注解信息的示例代码:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Field;

public class ReflectAnnotationDemo {

    @MyAnnotation(name = "original name", value = "original value")
    public String field;

    public static void main(String[] args) {
        ReflectAnnotationDemo demo = new ReflectAnnotationDemo();
        Class<?> clazz = demo.getClass();
        Field field = null;
        try {
            field = clazz.getField("field");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);
        System.out.println("Original annotation: " + annotation);

        MyAnnotation newAnnotation = new MyAnnotation() {
            public String name() {
                return "new name";
            }

            public String value() {
                return "new value";
            }

            public Class<? extends Annotation> annotationType() {
                return MyAnnotation.class;
            }
        };
        try {
            field.setAnnotation(newAnnotation);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        MyAnnotation modifiedAnnotation = field.getAnnotation(MyAnnotation.class);
        System.out.println("Modified annotation: " + modifiedAnnotation);
    }
}

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    String name() default "default name";

    String value() default "default value";
}

在上面的示例中,我们使用Field类的getAnnotation()方法获取了类中某个字段的注解信息,然后创建了一个新的注解对象,并使用Field类的setAnnotation()方法将原有的注解信息替换为新的注解信息。