在注释中使用资源包字符串
Use resource bundle strings in 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)定义了消息包的标准位置。
所以我正在尝试一个名为 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)定义了消息包的标准位置。