通过反射将一个类中字段的所有值复制到另一个类中

新手上路,请多包涵

我有一个类,它基本上是另一个类的副本。

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

        }
    }

我相信一定有人已经以某种方式做到了这一点

原文由 Shervin Asgari 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 607
2 个回答

如果您不介意使用第三方库,Apache Commons 的 BeanUtils 将很容易地处理这个问题,使用 copyProperties(Object, Object)

原文由 Greg Case 发布,翻译遵循 CC BY-SA 3.0 许可协议

你为什么不使用 gson 库 https://github.com/google/gson

您只需将 A 类转换为 json 字符串。然后将 jsonString 转换为您的子类(CopyA)。使用以下代码:

 Gson gson= new Gson();
String tmp = gson.toJson(a);
CopyA myObject = gson.fromJson(tmp,CopyA.class);

原文由 Eric Ho 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题