2015-10-20 71 views
0

我有一個映射,它將鍵和值存儲爲字符串數據類型。 我需要編寫一個函數將映射中的某些值從字符串數據類型轉換爲另一種數據類型。使用反射的數據類型轉換函數

例如,有一個密鑰"active"和值"false"。我需要將該值轉換爲boolean false

對於這一點,我能有這樣的功能:

public static void typeConverter(Map container, String key, Class toType) { 
    if(container.containsKey(key)) { 
     if(tyType == Boolean.class) 
      container.put(key, Boolean.parseBoolean(container.get(key))); 
     if(tyType == Integer.class) 
      container.put(key, Integer.parseBoolean(container.get(key))); 
     ... 
    } 
} 

不過,我想使用反射,避免如果循環:

public static void typeConverter(Map container, String key, Class toType) { 
    if(container.containsKey(key)) 
     container.put(key, toType.parse*(container.get(key))); 
} 

這是可能的任何機會?

回答

0

由於您傳遞的是Class對象,因此當您調用typeConverter(...)時,是否知道您希望它變爲哪種類型? 如果是這樣,你可以傳入一個對象來完成轉換並返回所需的類型。

public interface Converter<R> 
{ 
    public R convert(String value); 
} 

創建具體類型的子類

public class IntConverter implements Converter<Integer> 
{ 
    public Integer convert(String value) { ... } 
} 

然後調用類型轉換器,並把它傳遞正確的轉換器。

public static void typeConverter(Map container, String key, Converter<?> converter) { 
    if(container.containsKey(key)) { 
     return converter.convert(container.get(key)); 
    } 
} 
+0

我想加入如果我在我的代碼中提供的循環比這種方法更好,因爲在這裏我需要在我的情況下實現接口而不是一行。 – cppcoder

0

假設所有可能的值類型是基本類型,的valueOf存在於所有的原始類型如Integer的方法,布爾... 所以你可以使用反射動態調用此方法。

public static void convert(Map container, String key, Class toType) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{ 
    Method method=toType.getMethod("valueOf", String.class); 
    if(container.containsKey(key)){ 
     container.put(key, method.invoke(toType, container.get(key))); 
    } 
} 

或者你也可以採取解析器方法名作爲參數傳遞給你的函數,其結果將是

public static void convert(Map container, String key, Class toType, String parserMethodName) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{ 
    Method method=toType.getMethod(parserMethodName, String.class); 
    if(container.containsKey(key)){ 
     container.put(key, method.invoke(toType, container.get(key))); 
    } 
} 

這適用於任何類型的工作,只要解析器方法能夠將字符串轉換爲目標類型。