自学内容网 自学内容网

Java反射getAnnotations() 和 getDeclaredAnnotations() 的区别和用法

getAnnotations()

方法签名
public Annotation[] getAnnotations()
功能
  • 获取类或接口上声明的所有注解,包括从父类继承的注解。
  • 返回一个包含所有注解的数组。
  • 如果类或接口上没有注解,返回一个长度为 0 的数组。
关键点
  • 继承性:包括从父类继承的注解。
  • 返回值:返回一个 Annotation 对象的数组。
示例

假设我们有一个带有注解的父类和子类:

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

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

@Retention(RetentionPolicy.RUNTIME)
@interface AnotherAnnotation {
    int id() default 0;
}

@MyAnnotation("Hello, World!")
public class Parent {
}

@AnotherAnnotation(id = 123)
public class Child extends Parent {
    public static void main(String[] args) {
        Class<Child> childClass = Child.class;
        
        // 获取所有注解,包括继承的注解
        Annotation[] annotations = childClass.getAnnotations();
        System.out.println("getAnnotations(): " + Arrays.toString(annotations)); // 输出: [@MyAnnotation(value=Hello, World!), @AnotherAnnotation(id=123)]
        
        // 遍历数组并打印每个注解
        System.out.println("Annotations from getAnnotations():");
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }
    }
}

getDeclaredAnnotations()

方法签名
public Annotation[] getDeclaredAnnotations()
功能
  • 获取类或接口上声明的所有注解,但不包括从父类继承的注解。
  • 返回一个包含所有注解的数组。
  • 如果类或接口上没有注解,返回一个长度为 0 的数组。
关键点
  • 继承性:不包括从父类继承的注解。
  • 返回值:返回一个 Annotation 对象的数组。
示例

继续使用上面的父类和子类:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;

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

@Retention(RetentionPolicy.RUNTIME)
@interface AnotherAnnotation {
    int id() default 0;
}

@MyAnnotation("Hello, World!")
public class Parent {
}

@AnotherAnnotation(id = 123)
public class Child extends Parent {
    public static void main(String[] args) {
        Class<Child> childClass = Child.class;
        
        // 获取所有声明的注解,不包括继承的注解
        Annotation[] declaredAnnotations = childClass.getDeclaredAnnotations();
        System.out.println("getDeclaredAnnotations(): " + Arrays.toString(declaredAnnotations)); // 输出: [@AnotherAnnotation(id=123)]
        
        // 遍历数组并打印每个注解
        System.out.println("Annotations from getDeclaredAnnotations():");
        for (Annotation annotation : declaredAnnotations) {
            System.out.println(annotation);
        }
    }
}

详细对比

  1. 继承性

    • getAnnotations():包括从父类继承的注解。
    • getDeclaredAnnotations():不包括从父类继承的注解。
  2. 返回值类型

    • 两者都返回一个包含所有注解的数组,如果没有注解则返回一个长度为 0 的数组。
  3. 用途

    • getAnnotations():适用于需要获取类及其父类上的所有注解的场景。
    • getDeclaredAnnotations():适用于需要获取类本身声明的所有注解的场景,排除父类的影响。

示例对比

假设我们有一个类 Parent 和一个继承它的类 Child,上面分别有两个注解:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;

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

@Retention(RetentionPolicy.RUNTIME)
@interface AnotherAnnotation {
    int id() default 0;
}

@MyAnnotation("Hello, World!")
public class Parent {
}

@AnotherAnnotation(id = 123)
public class Child extends Parent {
    public static void main(String[] args) {
        Class<Child> childClass = Child.class;
        
        // 获取所有注解,包括继承的注解
        Annotation[] annotations = childClass.getAnnotations();
        System.out.println("getAnnotations(): " + Arrays.toString(annotations)); // 输出: [@MyAnnotation(value=Hello, World!), @AnotherAnnotation(id=123)]
        
        // 获取所有声明的注解,不包括继承的注解
        Annotation[] declaredAnnotations = childClass.getDeclaredAnnotations();
        System.out.println("getDeclaredAnnotations(): " + Arrays.toString(declaredAnnotations)); // 输出: [@AnotherAnnotation(id=123)]
        
        // 遍历数组并打印每个注解
        System.out.println("Annotations from getAnnotations():");
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }
        
        System.out.println("Annotations from getDeclaredAnnotations():");
        for (Annotation annotation : declaredAnnotations) {
            System.out.println(annotation);
        }
    }
}

输出

getAnnotations(): [@MyAnnotation(value=Hello, World!), @AnotherAnnotation(id=123)]
getDeclaredAnnotations(): [@AnotherAnnotation(id=123)]
Annotations from getAnnotations():
@MyAnnotation(value=Hello, World!)
@AnotherAnnotation(id=123)
Annotations from getDeclaredAnnotations():
@AnotherAnnotation(id=123)

详细说明

  1. getAnnotations()

    • 继承性getAnnotations() 会递归地查找类及其所有父类上的注解。
    • 适用场景:当你需要获取类及其所有父类上的所有注解时,使用 getAnnotations()
    • 示例:在上面的示例中,Child 类继承了 Parent 类,getAnnotations() 方法不仅获取了 Child 类上的 @AnotherAnnotation 注解,还获取了 Parent 类上的 @MyAnnotation 注解。
  2. getDeclaredAnnotations()

    • 继承性getDeclaredAnnotations() 只获取类本身声明的注解,不包括父类的注解。
    • 适用场景:当你只需要获取类本身声明的注解,而不关心父类的注解时,使用 getDeclaredAnnotations()
    • 示例:在上面的示例中,Child 类上的 getDeclaredAnnotations() 方法只获取了 Child 类上声明的 @AnotherAnnotation 注解,而没有获取 Parent 类上的 @MyAnnotation 注解。

总结

  • getAnnotations():获取类及其父类上的所有注解。
  • getDeclaredAnnotations():获取类本身声明的所有注解,不包括父类的注解。

原文地址:https://blog.csdn.net/m0_50742275/article/details/143858915

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!