3

我需要从一个类中获取私有字段并将它们设置为另一个类。

此代码非常适用于测试整数字段(写入 100500 值):

//get objects, class firs...

for(int i =0; i<fields1.length; i++) {
    Field field1 = fields1 [i];
    Field field = fields [i];
    field.setAccessible(true);
    field.set(app,  new Integer(100500));       
}

尽管如此,当我切换到未定义类型时(字段是不同类型的:日期、整数、字符串......

例如,第一类有日期,第二类有日期,我需要从另一个值复制一个值,但下一个字段在两个类中都是字符串)

for(int i =0; i<fields1.length; i++) {
    Field field1 = fields1 [i];
    Field field = fields [i];
    field.setAccessible(true);
    field.set(app,  field1);        
}

我收到一个 IllegalArgumentException,例如,我无法从一个类中获取值并将其设置到另一个类中。

亲爱的社区,请给我一个提示 - 我做错了什么?

4

3 回答 3

2

对我来说,看起来你交出了字段引用而不是字段值:

for(int i =0; i<fields1.length; i++) {
        Field field1 = fields1 [i];
        Field field = fields [i];
        field.setAccessible(true);
        field.set(app,  field1.get(app1)); //or whatever object field1 is from        
        }

虽然我不会那样做,因为订单是一件脆弱的事情......你可以使用beanutils来复制你的豆子,如果是的话,你想要实现什么

于 2013-02-04T10:59:30.430 回答
2

这应该适合您的需求:

public static <T> void copyDeclaredFields(T from, T to) throws Exception {
    Class<?> clazz = from.getClass();
    if (!clazz.equals(to.getClass())) {
        throw new IllegalArgumentException();
    }
    for (Field field : clazz.getDeclaredFields()) {
        Object value = field.get(from);
        field.set(to, value);
    }
}

致电:

Item item1 = new Item();
// item1.set...
Item item2 = new Item();
copyDeclaredFields(item1, item2);
于 2013-02-04T11:01:03.700 回答
1

您的错误似乎与您尝试将Field1设置为 Field 的参数,而不是 Field1 的有关。

field.set(app,  field1);  

应该改为

field.set(app,  field1.get(app1));

一个小的工作示例

如果你改变

fieldDest.set(destination, fieldSrc.get(source));

fieldDest.set(destination, fieldSrc);

你会得到这个问题的相同错误。

希望有帮助。

示例代码:

import java.util.*;
import java.lang.*;
import java.lang.reflect.*;

class Main
{

        public static void main (String[] args) throws java.lang.Exception
        {
            Source source = new Source();
        Destination destination = new Destination();


        Class sourceClassObject = source.getClass();
        Class destClassObject = destination.getClass();
        Field[] sourceFields = sourceClassObject.getDeclaredFields();
        Field[] destFields = destClassObject.getDeclaredFields();

        for (Field fieldSrc : sourceFields) {
            int mod = fieldSrc.getModifiers();  // get modifiers
            System.out.print("Source Field: " + Modifier.toString(mod) + " "
              + fieldSrc.getType() + " " + fieldSrc.getName());
            fieldSrc.setAccessible(true);
            System.out.println(" [" + fieldSrc.get(source) + "]");
            for (Field fieldDest : destFields){
                if (fieldDest.getType().equals(fieldSrc.getType()) && 
                    fieldDest.getName().equals(fieldSrc.getName())){
                    fieldDest.setAccessible(true);
                    fieldDest.set(destination, fieldSrc.get(source));
                }                
            }
        }

        destination.printValues();
    }

    static class Source{        

        public Source(){
            strField = "This is a String";
            intField = 42;
            dateField = new Date();
        }

        private String  strField;
        private Integer intField;
        private Date    dateField;
    }

    static class Destination{        
        private String  strField;
        private Integer intField;
        private Date    dateField;

        public void printValues(){
            System.out.println("Destination Field values: ");
            System.out.println("strField: " + strField);
            System.out.println("intField: " + intField);
            System.out.println("dateField: " + dateField);
        }
    }    
}
于 2013-02-04T12:56:52.923 回答