Java 使用反射的数据类型转换函数

Java 使用反射的数据类型转换函数,java,type-conversion,Java,Type Conversion,我有一个以字符串数据类型存储键和值的映射。 我需要编写一个函数,将映射中的某些值从字符串数据类型转换为另一种数据类型 例如,有一个键处于活动状态,值为false。我需要将该值转换为布尔值false 为此,我可以使用如下函数: public static void typeConverter(Map container, String key, Class toType) { if(container.containsKey(key)) { if(tyType == Boo

我有一个以字符串数据类型存储键和值的映射。 我需要编写一个函数,将映射中的某些值从字符串数据类型转换为另一种数据类型

例如,有一个键处于活动状态,值为false。我需要将该值转换为布尔值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)));
        ...
    }
}
但是,我希望使用反射并避免if循环:

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

这有可能吗?

既然您正在传递类对象,那么您知道在调用typeConverter…(类型转换器)时希望它变成哪种类型吗。。。? 如果是这样,您可以传入一个对象来进行转换并返回所需的类型

public interface Converter<R>
{
     public R convert(String value);
}
创建具体类型的子类

public class IntConverter implements Converter<Integer>
{
    public Integer convert(String value) { ... }
}
然后调用typeConverter,并将其传递给正确的转换器

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

假设所有可能的值类型都是基元类型,则对于所有基元类型(如整型、布尔型)都存在valueOf方法。。。 因此,您可以使用反射动态调用此方法

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

这将适用于任何类型,只要解析器方法能够将字符串转换为目标类型。

我认为添加我在代码中提供的if循环比这种方法更好,因为这里我需要实现接口,而不是在我的示例中实现一行。