Java 从字符串转换为动态类型?

Java 从字符串转换为动态类型?,java,Java,我正在尝试从csv文件动态创建对象。我要谈到这一部分: 假设我有这门课: package com.example public TestClass { public int hi = 0; public String ho = "ho"; } 我还有一个csv: hi,ho 1,"hello" 在下面的代码中,classIdentifier是一个类名字符串(即“com.example.TestClass”),maps是一个HashMap,用于存储从csv文件读取的数据

我正在尝试从csv文件动态创建对象。我要谈到这一部分:

假设我有这门课:

package com.example
public TestClass {
    public int hi = 0;
    public String ho = "ho";
}
我还有一个csv:

hi,ho
1,"hello"
在下面的代码中,classIdentifier是一个类名字符串(即“com.example.TestClass”),maps是一个HashMap,用于存储从csv文件读取的数据

    Class<T> c = (Class<T>) classIdentifier.getClass();
    Set<String> keys = maps.keySet(); 
    for(String key : keys) {
        System.out.println(classIdentifier, c.getDeclaredField(key).getType());
        System.out.println(maps.get(key));
        c.getDeclaredField(key).set(classIdentifier, c.getDeclaredField(key).getType().cast(maps.get(key)));
    }
Class c=(Class)classIdentifier.getClass();
Set keys=maps.keySet();
用于(字符串键:键){
System.out.println(classIdentifier,c.getDeclaredField(key.getType());
System.out.println(maps.get(key));
c、 getDeclaredField(key).set(classIdentifier,c.getDeclaredField(key).getType().cast(maps.get(key)));
}
上述代码将打印出预期值: int 一,

但是,这将在铸件中引发以下错误: java.lang.ClassCastException:无法将java.lang.String强制转换为int

虽然在给定的示例中,hi是int,ho是string,但我确实希望扩展此代码的用法,以便能够使用任何类型进行转换。这意味着在使用c.getDeclaredField(key.getType()(这就是我所说的动态)之前,我对字段的类型一无所知


我只是想知道如何修复它?

您需要意识到您正试图设置为
int
字段,在设置字段值之前,请使用
Integer.parseInt
或类似的方法将字符串解析为整数,就像在普通代码中为字段赋值一样。@jonsket在本例中是一个int和字符串。然而,“动态”意味着类型的知识只在运行时才出现——这可以扩展相同的代码,将所有内容从csv转换为运行时给定的对象。我认为,检查这是否为int并转换为int并不是最好的方法。String!=int,即使字符串包含整数。如果您想要Java的动态版本,请尝试GroovyWell,我不想建议您这样做,但您可以将CSV转换为JSON作为
{“hi”:1,“ho”:“hello”}
,然后使用Jackson初始化您的类。@Jamesdeath 123:您可能认为这不是最好的方法,但必须考虑字段的类型并执行转换。。。