2013-08-01 69 views
0

是否可以將Java字符串轉換爲最終的Java對象。Java:將字符串轉換爲現有的最終對象

讓我們一個例子:

在.properties文件中,我有以下聲明

log_level=Level.ALL 

現在,Level.ALL是水平的最終目標。

我想在代碼中執行的操作是讀取.properties文件,將log_level讀取爲String,並將<somehow magically>解析爲對象Level.ALL中的String。

+0

好吧,我沒有完全理解你的問題。首先,最終的變數是其中之一分配後不能改變,並不意味着內容不能改變(當然,在字符串它確實意味着因爲字符串對象不能被改變)。現在,最終的靜態類變量是一個常量,並且在編譯時寫入,在運行時不能改變任何東西。不應該混淆的是,「最終」修飾符限定變量,而不是對象本身。你想要達到什麼目標?你有一些代碼示例? – Martin

回答

2

僅存儲「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(); 
} 
+0

哈哈......你確實解決了我的問題,但沒有回答這個問題; - )...不管怎樣,非常感謝! – Mayank

+0

我想你可以用一些瘋狂的反射代碼來實現你的目標,但這聽起來像是用大炮射擊鳥類。這是一個更優雅的解決方案,imo。 – MightyPork

+0

在這裏,我實際上爲你做了一些代碼。我不會做的,以獲得接受答案的積分;) – MightyPork

0
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);