Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java-field.set(object1,object2)仅在object1是字符串时工作_Java_Field - Fatal编程技术网

java-field.set(object1,object2)仅在object1是字符串时工作

java-field.set(object1,object2)仅在object1是字符串时工作,java,field,Java,Field,我是java新手。我试图从XML文件中的字段填充一个类。我编写了这段代码,看起来很有效,但只处理字符串字段 守则: private void setValue(String className, Node n, Object thObject) { try { Class oClass = thObject.getClass(); Field [] f = thObject.getClass().getDeclaredFields();

我是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) {
                    }
                }
            }

    }
但没有工作的领域说空

有人知道我做错了什么吗?

使用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);
}
日期字符串必须是,或者您可以使用SimpleDataFormat来使用您选择的格式。

由于
节点#getNodeValue()
方法返回字符串,因此只能在字符串类型的字段上设置该值。对于其他字段类型,必须将节点值从字符串转换为目标字段类型。您可以检查字段以获取其类型并从中获取它


对于刚接触java的人来说,这是一项艰巨的工作。祝你好运

你的班级定义是什么?新手使用Java反射不是个好主意。
if(f[i].getName()==n.getNodeName()){
谢谢,我会把它改为equals,我正在重写我的程序,我在c#中的想法和几年前一样,它从来没有给我带来问题,在Java中问题更大?为什么这不起作用?f[i].setInt(thObject,Integer.parseInt(value.toString()))
但不起作用字段显示为空。
很可能是因为您使用了
=
而不是
equals
来比较字段的名称。如果您像我一样查找名称,您就不需要执行此搜索。谢谢!!!只工作了很好的日期我不知道怎么做,您能帮我确定日期吗?@stlip您有吗若要使用日期格式,则日期支持。否则,您必须使用SimpleDataFormat自己解析日期以选择格式。非常感谢您的帮助,我确实评估了您的帮助以及非常有用的示例代码
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