![](/img/trans.png)
[英]Java reflection to set static final field fails after previous reflection
[英]java - Set final fields with reflection in Constructor
我正在嘗試制作一個多語言應用程序,其中包含多個*.properties
文件中的消息。 我已經開始研究這樣的事情:
public Language(@NotNull Map<String, String> info) {
Validate.notNull(info, "Language information cannot be null");
this.PLUGIN_PREFIX = info.get("PLUGIN_PREFIX");
this.ARGUMENT_CODE = info.get("ARGUMENT_CODE");
// etc...
}
現在,有很多消息,而且我不想每次都輸入相同的內容(而且我可能會出現拼寫錯誤……)。
我想到的第一個解決方案是遍歷所有類似的字段(大寫,最終,非靜態等),然后使用反射將字段名稱用作鍵來將其設置為值。 顯然編譯器不會讓我這樣做,因為它認為 final 字段還沒有被初始化。
像這樣的東西:
public Language(@NotNull Map<String, String> info) {
Validate.notNull(info, "Language information cannot be null");
Field[] fields = /* TODO get fields */ new Field[0];
for (Field f : fields) f.set(f.getName(), info.get(f.getName()));
}
有沒有辦法可以工作? 還是有更好的解決方案?
編輯:快速命名約定問題,這些最終的“常量”是否應該大寫?
通常,您不會將文本消息直接存儲在常量中,而只是存儲消息鍵。 然后,您使用這些鍵來獲取地圖中的實際文本消息。
您可以直接使用地圖,但在 Java 中,有 ResourceBundle。 ResourceBundle 可以直接從 .properties 文件加載。
我的-bundle_en.properties:
my.message=Hello, world!
my-bundle_fr.properties:
my.message=Bonjour tout le monde!
my-bundle_de.properties:
my.message=Hallo Welt!
東西.java:
public static final MY_MESSAGE = "my.message";
ResourceBundle bundle = ResourceBundle.getBundle("my-bundle");
String text = bundle.getMessage(MY_MESSAGE);
System.out.println(text);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.