getAnnotations()返回空数组不符合预期,Java 8注解问题求助
问题分析与解决方案
你的问题核心很清晰——你期望通过Test.class.getAnnotations()获取到非空注解数组,但实际返回空,这是因为你把@Sometation注解标注在了main方法上,而非Test类本身,而你调用的方法是专门获取类级别注解的,自然拿不到结果。
1. 错误原因拆解
看你的代码,注解的位置在方法上:
@Sometation public static void main(String[] args) { // ... }
而Test.class.getAnnotations()、Test.class.getDeclaredAnnotations()这两个方法的作用是获取类本身上的注解,和方法上的注解属于完全不同的标注位置,所以返回空数组是正常的。
2. 两种修复方案
方案一:将注解移到类上(匹配你的预期)
如果你的需求是让Test类带有该注解,只需把@Sometation移到类定义的上方:
import java.util.Arrays; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @interface Sometation {} @Sometation // 标注在类上 public class Test { public static void main(String[] args) { System.out.println(Arrays.toString(Test.class.getAnnotations())); System.out.println(Arrays.toString(Test.class.getDeclaredAnnotations())); } }
运行后就能得到类似[@Sometation()]的非空数组输出。
方案二:获取方法上的注解(若需求是方法注解)
如果你的本意是获取main方法上的注解,需要修改代码先拿到方法对象,再获取它的注解:
import java.util.Arrays; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Method; @Retention(RetentionPolicy.RUNTIME) @interface Sometation {} public class Test { @Sometation public static void main(String[] args) throws NoSuchMethodException { // 获取main方法的注解 Method mainMethod = Test.class.getMethod("main", String[].class); System.out.println(Arrays.toString(mainMethod.getAnnotations())); System.out.println(Arrays.toString(mainMethod.getDeclaredAnnotations())); } }
这段代码会输出方法上的注解数组,符合你的预期。
补充说明
你已经正确设置了@Retention(RetentionPolicy.RUNTIME),这一点完全没问题——只有RUNTIME级别的注解才能在运行时通过反射获取,这部分你做对了,无需修改。
内容的提问来源于stack exchange,提问作者Lamaun
相关产品推荐
相关产品推荐

