You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:08:56