1. ホーム
  2. java

[解決済み] リフレクションにより、あるクラスのフィールドから別のクラスへすべての値をコピーする

2023-07-05 15:56:15

質問

基本的に他のクラスのコピーであるクラスがあります。

public class A {
  int a;
  String b;
}

public class CopyA {
  int a;
  String b;
}

私がやっていることは、クラス A の値を CopyA を送信する前に CopyA をウェブサービス呼び出しを通して送信します。さて、私は基本的にクラス A からクラス CopyA .

どうすればいいのでしょうか?

これは私が今のところ持っているものですが、なかなかうまくいきません。この問題は、私がループしているフィールドにフィールドを設定しようとしていることだと思います。

private <T extends Object, Y extends Object> void copyFields(T from, Y too) {

    Class<? extends Object> fromClass = from.getClass();
    Field[] fromFields = fromClass.getDeclaredFields();

    Class<? extends Object> tooClass = too.getClass();
    Field[] tooFields = tooClass.getDeclaredFields();

    if (fromFields != null && tooFields != null) {
        for (Field tooF : tooFields) {
            logger.debug("toofield name #0 and type #1", tooF.getName(), tooF.getType().toString());
            try {
                // Check if that fields exists in the other method
                Field fromF = fromClass.getDeclaredField(tooF.getName());
                if (fromF.getType().equals(tooF.getType())) {
                    tooF.set(tooF, fromF);
                }
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

きっとどこかでやっている人がいるはずです。

どのように解決するのですか?

サードパーティのライブラリを使っても構わない場合。 BeanUtils を使えば、非常に簡単にこれを処理できます。 copyProperties(Object, Object) .