是否可以將Java字符串轉換爲最終的Java對象。Java:將字符串轉換爲現有的最終對象
讓我們一個例子:
在.properties文件中,我有以下聲明
log_level=Level.ALL
現在,Level.ALL
是水平的最終目標。
我想在代碼中執行的操作是讀取.properties文件,將log_level讀取爲String,並將<somehow magically>
解析爲對象Level.ALL
中的String。
是否可以將Java字符串轉換爲最終的Java對象。Java:將字符串轉換爲現有的最終對象
讓我們一個例子:
在.properties文件中,我有以下聲明
log_level=Level.ALL
現在,Level.ALL
是水平的最終目標。
我想在代碼中執行的操作是讀取.properties文件,將log_level讀取爲String,並將<somehow magically>
解析爲對象Level.ALL
中的String。
僅存儲「ALL」,然後使用Level.parse(stringFromConfig)
- 並獲得最終對象Level.ALL。
爲了滿足您對飢餓的確切答案,我寫了下面的代碼。
我不完全確定這是你的意思,但這是我能想到的最好的。
正如你在瘋狂的catch
叢林中看到的那樣,這是一件危險的事情,我們正在處理。
String str = "Level.SEVERE";
String pcg = Level.class.getPackage().getName();
str = pcg + "." + str;
// now we have package.ClassName.fieldName in "str"
String className = str.substring(0, str.lastIndexOf('.'));
String fieldName = str.substring(str.lastIndexOf('.') + 1, str.length());
try {
Class<?> c = Class.forName(className);
Field f = c.getDeclaredField(fieldName);
// here comes content of the field
// for non-final fields you must put field's class here instead of NULL
Object o = f.get(null);
System.out.println(o);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
哈哈......你確實解決了我的問題,但沒有回答這個問題; - )...不管怎樣,非常感謝! – Mayank
我想你可以用一些瘋狂的反射代碼來實現你的目標,但這聽起來像是用大炮射擊鳥類。這是一個更優雅的解決方案,imo。 – MightyPork
在這裏,我實際上爲你做了一些代碼。我不會做的,以獲得接受答案的積分;) – MightyPork
if (System.getProperty("STANDALONE_LOG_LEVEL")!=null){
String logLevel= System.getProperty("STANDALONE_LOG_LEVEL");
switch(logLevel){
case "ERROR" : this.aRootLogLevel=Level.ERROR;
break;
case "DEBUG" : this.aRootLogLevel=Level.DEBUG;
break;
case "INFO" : this.aRootLogLevel=Level.INFO;
break;
case "WARN" : this.aRootLogLevel=Level.WARN;
break;
case "FATAL" : this.aRootLogLevel=Level.FATAL;
break;
default : this.aRootLogLevel=Level.INFO;
}
}
rootLogger.setLevel(this.aRootLogLevel);
好吧,我沒有完全理解你的問題。首先,最終的變數是其中之一分配後不能改變,並不意味着內容不能改變(當然,在字符串它確實意味着因爲字符串對象不能被改變)。現在,最終的靜態類變量是一個常量,並且在編譯時寫入,在運行時不能改變任何東西。不應該混淆的是,「最終」修飾符限定變量,而不是對象本身。你想要達到什麼目標?你有一些代碼示例? – Martin