我如何将atrributes值从一个对象传递到另一个

时间:2015-07-25 00:28:32

标签: java reflection

我希望将来自我的实体管理器的对象的转移属性值转换为新对象。

返回Object始终为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();
        }

3 个答案:

答案 0 :(得分:1)

真的很想念你为什么使用2循环? ..如果类是相同的。你不需要这样做..只需要在1循环中进行..并使用字段获取obj,它持有数据..并使用set来设置..这里是更好的方法..如果需要相同的对象你可以使用泛型..并且需要相同的对象类型(请求返回类型)

from sys import argv

one, two, three = argv[1:]

print "My first number is ", one
print "My second number is ", two
print "My third number is ", three

答案 1 :(得分:0)

  

返回Object始终为null

返回对象(即a包含的return)不可能是null

很容易看出代码不会更改引用a。方法中没有赋值,因此无法更改。

另一种可能性是您为null调用了a值的方法。但是,如果你这样做,方法的第一行会调用a.getClass(),如果anull,则会抛出NPE。

TL; DR - 这是不可能的。

那是什么意思?

以下是最可能的解释:

  1. 您错了正在返回null。也许这个方法没有被调用?也许,它不会回归?

  2. 也许你以某种其他方式误解了证据。没有看到代码......和证据就很难知道。

  3. 也许你不是意味着该方法正在返回Object;即我误解了这个问题。 (你的问题描述非常明确,但是......)

答案 2 :(得分:0)

我对代码进行了更改,并努力为我更新

fgetcsv()

电话

 public static Object copyAttributesFromTo(Object a, Object b) throws IllegalArgumentException, IllegalAccessException {
        Field[] fieldsFromFirstClass = a.getClass().getDeclaredFields();
        Field[] fieldsFromSecondClass = b.getClass().getDeclaredFields();
        //JSFMessageUtil.addMsgLog(JSFMessageUtil.matricula, ReflectionUtil.class.getCanonicalName(), "ReflectionUtil: Aqui");
        for (Field currentFieldFromTheFirstClass : fieldsFromFirstClass) {
            for (Field currentFieldFromTheSecondClass : fieldsFromSecondClass) {
                Object nameOfTheFirstField = currentFieldFromTheFirstClass.getName();
                Object 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);
                            //JSFMessageUtil.addMsgLog(JSFMessageUtil.matricula, ReflectionUtil.class.getCanonicalName(), "ReflectionUtil: " + currentFieldFromTheSecondClass.get(b));
                            currentFieldFromTheFirstClass.set(a, currentFieldFromTheSecondClass.get(b));
                        }
                    //}
                }
            }
        }

        return a;
    }