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

标签 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();

这里有一个问题:注释中不允许使用非常量变量,因此代码将无法编译。有什么解决方法可以避免此错误吗?

最佳答案

您可能需要在注释上至少指定包名称(也许还有键);像这样:

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();
    }
}

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

某些框架(例如 Bean Validation )定义消息包的标准位置。

关于java - 在注释中使用资源包字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28501439/

相关文章:

spring - 如何使用 Kotlin 在 Spring Boot 中处理自定义注解?

java - 在哪种情况下您使用 JPA @JoinTable 注释?

java - JSF 值表达式和 bean,它们如何工作?

java - 如何根据selenium webdriver中的其他元素选择一个元素

java - 包含 Thread 成员的 Runnable 对象有什么问题吗?

java - 使用 Java 6 注释处理器获取泛型类型的限定类名

Java字体显示问题

java - 将具有嵌套 Java 类数组的 Java 类转换为 JSON

java - 错误的服务配置文件,或构造 Processor 对象时抛出的异常

python - 在 Django 中连接与查询集中记录的多行相关的字段