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

如何在多个带注解类之间共享configuration配置并解决注解处理实例化问题

问题根本原因

注解处理器运行在Java编译的前期阶段,此时待编译工程的类尚未完成编译和类加载,因此无法通过反射直接实例化SharedConfig这类工程内定义的类。


可用解决方案

方案1:改用注解属性+常量承载共享配置

直接将配置值定义为常量,在注解属性中直接引用,不需要额外的配置类实例,是最适合编译期处理的实现方式:

// 定义常量类存储共享配置
public class ConfigConstants {
    public static final String CONFIG_STR = "abc";
    public static final int CONFIG_NUM = 123;
}

// 调整注解结构,直接接收配置值
@MyAnnotation(configStr = ConfigConstants.CONFIG_STR, configNum = ConfigConstants.CONFIG_NUM)
class A {}

@MyAnnotation(configStr = ConfigConstants.CONFIG_STR, configNum = ConfigConstants.CONFIG_NUM)
class B {}

适用场景:配置固定为常量、不需要复杂初始化逻辑的场景,注解处理器可以直接读取注解属性的常量值,不需要额外解析。


方案2:编译期解析配置类的静态值,不做实例化

如果需要保留配置类的结构,可将配置值定义为配置类的公共静态字段,注解处理器通过javax.lang.modelAPI直接读取静态字段的常量值,无需实例化类:

class SharedConfig extends BaseConfig{
    public static final String STR_VAL = "abc";
    public static final int INT_VAL = 123;

    public SharedConfig(){
        super(STR_VAL, INT_VAL);
    }
}

注解处理器处理时,直接读取SharedConfig类的静态字段值即可,全程不需要触发类实例化。
适用场景:需要同时保留运行期配置类实例能力、编译期也要读取配置的场景。


方案3:推迟配置实例化逻辑到运行期

如果你的配置本身是运行时使用的,注解处理器只需要记录下配置类的全限定名,在生成的代码中写入实例化逻辑即可:
比如注解处理器生成的辅助代码可以写成:

public class ConfigHolder {
    public static BaseConfig getSharedConfig() {
        return new SharedConfig();
    }
}

运行时调用上述方法即可拿到正确的配置实例,不存在编译期无法实例化的问题。
适用场景:配置需要复杂初始化逻辑、仅在运行时使用的场景。


内容的提问来源于stack exchange,提问作者Richard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:18:03