在注释中使用资源包字符串

时间:2015-02-13 14:08:12

标签: java annotations

所以我正在尝试一个名为JewelCli的cli解析库,它使用注释很容易定义选项。假设我的选项看起来像是

@Option(shortName = "p")
int getPort();

到目前为止一直很好,现在我添加了此选项的说明。由于程序必须支持多种语言,因此描述来自资源包:

static final String DESC_PORT = ResourceBundle.getBundle("someBundle").getString("someKey");

@Option(shortName = "p",
        description = DESC_PORT)
int getPort();

接下来是注释:注释中不允许使用非常量变量,因此代码不会编译。是否有任何解决方法可以避免此错误?

1 个答案:

答案 0 :(得分:0)

您可能需要在注释中至少指定包名称(可能还有密钥);类似的东西:

public class BundleDemo {
    private static final String BUNDLE_NAME = "Messages";

    @BundleDemo.Message(BundleDemo.BUNDLE_NAME)
    public String foo;

    public static void main(String[] args) throws Exception {
        for(Field field : BundleDemo.class.getFields()) {
            Message message = field.getAnnotation(Message.class);
            ResourceBundle bundle = ResourceBundle.getBundle(message.value());
            String value = bundle.getString(field.getName());
            System.out.println(value);
        }
    }

    @Retention(value = RetentionPolicy.RUNTIME)
    @Target(value = ElementType.FIELD)
    public @interface Message {
        String value();
    }
}

此代码假定在类路径的根目录中包含属性 foo 的Messages.properties。

某些框架(如Bean Validation)定义了邮件包的标准位置。