Java:将字符串转换为现有的最终对象

时间:2013-08-01 14:15:52

标签: java string logging

是否可以将Java String转换为最终的Java Object。

让我们举一个例子:

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

log_level=Level.ALL

现在,Level.ALL是Level的最终对象。

我想在代码中做的是读取.properties文件,将log_level作为String读取,<somehow magically>将String解析为对象Level.ALL

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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 );