我是java的新手。我试图从XML文件中的字段填充一个类。我制作的代码看起来很有效但只有字符串字段
代码:
private void setValue(String className, Node n, Object thObject) {
try {
Class oClass = thObject.getClass();
Field [] f = thObject.getClass().getDeclaredFields();
for (int i = 0 ; i < f.length; i++){
if (f[i].getName() == n.getNodeName()){
f[i].setAccessible(true);
try {
Object value = n.getNodeValue();
if (value != null) {
f[i].set(thObject, value);
}
} catch (IllegalAccessException e) {
}
}
}
}
f[i].set
只有在字符串字段
我试着这样做:
f[i].setInt(thObject, Integer.parseInt(value.toString()))
但没有工作该字段说空了。
有谁知道我做错了什么?
答案 0 :(得分:1)
使用Field.set()不会更改数据类型以适合字段类型。如果要设置各种类型,则必须先进行转换。 e.g。
Field field = thObject.getClass().getDeclaredField(n.getNodeName());
field.setAccessible(true);
Object value = n.getNodeValue();
Object asType = convertToType(value, field.getType());
field.set(thObject, asType);
您必须实现convertToType以满足您的需求。
这是一个简单的实现。
private static final Map<Class, Class> WRAPPER_MAP = new LinkedHashMap<Class, Class>() {{
put(boolean.class, Boolean.class);
put(byte.class, Byte.class);
put(char.class, Character.class);
put(short.class, Short.class);
put(int.class, Integer.class);
put(float.class, Float.class);
put(long.class, Long.class);
put(double.class, Double.class);
}};
public static <T> T convertToType(Object o, Class<T> clazz) {
Class<T> wrapper = WRAPPER_MAP.get(clazz);
if (wrapper != null)
clazz = wrapper;
if (o == null || clazz.isInstance(o))
return (T) o;
try {
try {
Method valueOf = clazz.getDeclaredMethod("valueOf", o.getClass());
return (T) valueOf.invoke(null, o);
} catch (NoSuchMethodException e1) {
Constructor<T> constructor = clazz.getConstructor(o.getClass());
return constructor.newInstance(o);
}
} catch (Exception e) {
throw new AssertionError(e);
}
}
public static void main(String... args) {
String text = "1000";
for (Class clazz : new Class[]{String.class, Integer.class, double.class, BigDecimal.class, Thread.class}) {
Object o = convertToType(text, clazz);
System.out.println(o.getClass() + " " + o);
}
Object o = convertToType("RUNNABLE", Thread.State.class);
System.out.println(o.getClass() + " " + o);
String dateString = new Date().toString();
Date date = convertToType(dateString, Date.class);
System.out.println(date.getClass() + " " + date);
}
打印
class java.lang.String 1000
class java.lang.Integer 1000
class java.lang.Double 1000.0
class java.math.BigDecimal 1000
class java.lang.Thread Thread[1000,5,main]
class java.lang.Thread$State RUNNABLE
class java.util.Date Thu Jan 03 17:08:50 GMT 2013
日期字符串必须是format Date will parse,或者您可以使用SimpleDateFormat来使用您选择的格式。
答案 1 :(得分:1)
由于Node#getNodeValue()
方法返回一个String,因此只能在String类型的字段上设置该值。对于其他字段类型,必须将节点值从String转换为目标字段类型。您可以检查该字段以获取其类型并从那里获取。
刚接触java的人的艰苦工作。祝你好运!