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

それにもかかわらず、未定義の型に切り替えると (フィールドは異なる型です: 日付、整数、文字列...

たとえば、クラス 1 には日付があり、クラス 2 には日付があります。ある値を別の値からコピーする必要がありますが、次のフィールドは両方のクラスで文字列になります)

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を使用してBeanをコピーできます。そうであれば、達成したいこと

于 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 の値ではなく、 Field1を Field のパラメーターとして設定しようとしているという事実に関連しているようです。

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 に答える