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);
}
}
}
详细对比
-
继承性
getAnnotations()
:包括从父类继承的注解。getDeclaredAnnotations()
:不包括从父类继承的注解。
-
返回值类型
- 两者都返回一个包含所有注解的数组,如果没有注解则返回一个长度为 0 的数组。
-
用途
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)
详细说明
-
getAnnotations()
- 继承性:
getAnnotations()
会递归地查找类及其所有父类上的注解。 - 适用场景:当你需要获取类及其所有父类上的所有注解时,使用
getAnnotations()
。 - 示例:在上面的示例中,
Child
类继承了Parent
类,getAnnotations()
方法不仅获取了Child
类上的@AnotherAnnotation
注解,还获取了Parent
类上的@MyAnnotation
注解。
- 继承性:
-
getDeclaredAnnotations()
- 继承性:
getDeclaredAnnotations()
只获取类本身声明的注解,不包括父类的注解。 - 适用场景:当你只需要获取类本身声明的注解,而不关心父类的注解时,使用
getDeclaredAnnotations()
。 - 示例:在上面的示例中,
Child
类上的getDeclaredAnnotations()
方法只获取了Child
类上声明的@AnotherAnnotation
注解,而没有获取Parent
类上的@MyAnnotation
注解。
- 继承性:
总结
getAnnotations()
:获取类及其父类上的所有注解。getDeclaredAnnotations()
:获取类本身声明的所有注解,不包括父类的注解。
原文地址:https://blog.csdn.net/m0_50742275/article/details/143858915
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!