java - 如何将属性值从一个对象传输到另一个对象

标签 java reflection

我想要将来自实体管理器的对象的属性值传输到新对象。

返回对象始终为 null

 public class ReflectionUtil {

    public static Object copyAttributesFromTo(Object a, Object b) throws IllegalArgumentException, IllegalAccessException {
        Field[] fieldsFromFirstClass = a.getClass().getDeclaredFields();
        Field[] fieldsFromSecondClass = b.getClass().getDeclaredFields();

        for (Field currentFieldFromTheFirstClass : fieldsFromFirstClass) {
            for (Field currentFieldFromTheSecondClass : fieldsFromSecondClass) {
                String nameOfTheFirstField = currentFieldFromTheFirstClass.getName();
                String nameOfTheSecondField = currentFieldFromTheSecondClass.getName();

                if (!Modifier.isFinal(currentFieldFromTheFirstClass.getModifiers())) {//Dispensa os Final
                    if (!currentFieldFromTheFirstClass.isAnnotationPresent(Id.class)) {//Não sobescreve campo id
                        if (nameOfTheFirstField.equals(nameOfTheSecondField)) {
                            currentFieldFromTheFirstClass.setAccessible(true);
                            currentFieldFromTheSecondClass.setAccessible(true);
currentFieldFromTheSecondClass.get(b));
                            currentFieldFromTheFirstClass.set(a, currentFieldFromTheSecondClass.get(b));
                        }
                    }
                }
            }
        }

        return a;
    }
}

在 Facade 调用中,我总是必须将所有属性值放入新对象

 public void update(Profile object) {
        dao.beginTransaction();
        Profile persistedObject = dao.find(object.getId());
        persistedObject.setName(object.getName());
        dao.commitAndCloseTransaction();
    }

所以我想创建一些类似的

public void update(Profile object) {
            dao.beginTransaction();
            Profile persistedObject = dao.find(object.getId());
            ReflectionUtil.copyAttributesFromTo(persistedObject , object);
            dao.commitAndCloseTransaction();
        }

最佳答案

真的很想知道为什么你要使用2个循环? ..如果类(class)相同。你不需要这样做..只需在1个循环中完成..并使用fields get for obj来保存数据..并使用set来设置..这是更好的方法..如果需要相同的对象你可以使用泛型..并且需要相同的对象类型(请求返回类型)

public static <T> T copyAttributesFromTo(T value, T dataHolder) throws IllegalArgumentException, IllegalAccessException {
        if (value == null || dataHolder == null) {
            throw new IllegalArgumentException();
        }
        final Field[] fields = value.getClass().getDeclaredFields();
        for (Field field : fields) {

            if (!Modifier.isFinal(field.getModifiers())) {               
                field.setAccessible(true);               
                field.set(value, field.get(dataHolder));
            }
        }

        return value; 
    }

关于java - 如何将属性值从一个对象传输到另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31621616/

相关文章:

Java 定时器 : how to select + what are the limitations?

java - 通用接口(interface)的工厂

.net - 如何在运行时转换类型?

java - 为什么非静态字段不能充当GC根?

javascript - 如何在 Angular 7 中下载 PDF?

java - 按列读取二维数组

c# - 如何在事先不知道 T 的情况下在运行时优雅地将 IEnumerable<T> 转换为 HashSet<T>

java - 使用反射在 java 中为 android 转换对象

c#-4.0 - 如何使用反射调用接口(interface)中的方法

c# - 如何在运行时确定 .Net 程序的入口点?