如何在多个带注解类之间共享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
相关产品推荐
相关产品推荐

