当前位置: 首页 > 知识库问答 >
问题:

将一个类的字段复制到另一个类的相同字段中

季炯
2023-03-14

我有这个问题。但我很难解释,因为我不知道确切的术语。希望有人能理解。我会尽力描述。我觉得这与解析密切相关

假设有两个类。在这两个类中,我都有一些变量,比如字符串(为简单起见,变量类型可以是任何变量),它们具有相似的名称。

Eg:
    class ClassA{
        String x,y,z;
    }

    class ClassB{
        String x,y,z;
    }

现在,我需要的是,我需要将一个类的变量值的值复制到其他类对应的变量中。

Eg:
    ClassA aa=new ClassA();
    ClassB bb=new ClassB();
    //set bb's variables
    aa.x=bb.x;
    aa.y=bb.y;
    aa.z=bb.z;

诸如此类。

但是请注意,我需要的不是上面的方法。我希望有一种方法可以写一个简单的方法,这样它就可以通过传递给它的名称来识别相关的变量。然后它会相应地进行值赋值。

我想象的方法是这样的,

void assign(String val){        
    // aa.<val>=val
}

例如,如果您传递bb。x赋值(…)method,然后它将执行aa.x=bb。x赋值。

希望这足够清楚。这肯定有更好的解释。如果有人知道,请编辑帖子(标题)让它更清楚(但保存我的想法)..

如果有办法做到这一点,请告诉我。

谢谢!


共有3个答案

华星剑
2023-03-14

新答案。

我建议去多佛看看,因为看起来很简单。

第二个选项是将类序列化为 XML,并仅在匹配的成员上反序列化为目标类。

我在评论中提到的第三个选项是使用反射——http://java.sun.com/developer/technicalArticles/ALT/Reflection/

这种技术允许一种叫做内省的好的设计模式——Java内省和反射,这反过来允许您发现某个类的成员...

话虽如此,我们可以简单地“发现”ClassA的成员,用他们的名字填充一个ArrayList,发现ClassB的成员,用他们的名字填充另一个ArrayList,然后复制相交集的值。至少这是我的想法。

韶浩皛
2023-03-14

你听说过道瑟吗?:http://dozer.sourceforge.net/

推土机

推土机是一个爪哇豆到爪哇豆映射器,它以递归方式将数据从一个对象复制到另一个对象。通常,这些 Java Bean 将具有不同的复杂类型。

Dozer支持简单属性映射、复杂类型映射、双向映射、隐式-显式映射以及递归映射。这包括映射也需要在元素级别映射的集合属性。

Dozer允许您映射Java Beans:

  • 使用它们的名称(隐式映射),即映射ClassA。x至B级。x
  • 提供了使用(非常简单的)xml或注释配置映射不同名称的不同结构(显式映射)的能力

以下是图书馆网站上的一个 XML 示例:

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://dozer.sourceforge.net
          http://dozer.sourceforge.net/schema/beanmapping.xsd">
          
  <mapping> 
    <class-a>org.dozer.vo.TestObject</class-a>
    <class-b>org.dozer.vo.TestObjectPrime</class-b>   
    <field>
      <a>one</a>
      <b>onePrime</b>
    </field>
  </mapping>  

      <!-- SNIP ... -->

</mappings>

这会将对象org.dozer.vo.TestObject映射到TestObjectPrime,将所有相同变量映射到一起(就像在你的例子中一样),并将变量TestObjectFoo.oneFooTestObjectFooPrime.oneFooPrime.

太好了,不是吗?

龙星辰
2023-03-14

推土机还好,看让-雷米的回答。

此外,如果变量具有符合JavaBeans标准的getters和setters,有许多技术可以帮助您,例如Apache Commons / BeanUtils

示例代码(未测试):

final Map<String, Object> aProps = BeanUtils.describe(a);
final Map<String, Object> bProps = BeanUtils.describe(b);
aProps.keySet().retainAll(bProps.keySet());
for (Entry<String, Object> entry : aProps.entrySet()) {
    BeanUtils.setProperty(b,entry.getKey(), entry.getValue());
}

更新:

如果您没有getters和setters,这里有一个快速的方法,只要字段具有公共的名称和类型,就可以将字段值从一个类复制到另一个类。我没有测试过,但是作为一个起点应该可以:

public final class Copier {

    public static void copy(final Object from, final Object to) {
        Map<String, Field> fromFields = analyze(from);
        Map<String, Field> toFields = analyze(to);
        fromFields.keySet().retainAll(toFields.keySet());
        for (Entry<String, Field> fromFieldEntry : fromFields.entrySet()) {
            final String name = fromFieldEntry.getKey();
            final Field sourceField = fromFieldEntry.getValue();
            final Field targetField = toFields.get(name);
            if (targetField.getType().isAssignableFrom(sourceField.getType())) {
                sourceField.setAccessible(true);
                if (Modifier.isFinal(targetField.getModifiers())) continue;
                targetField.setAccessible(true);
                try {
                    targetField.set(to, sourceField.get(from));
                } catch (IllegalAccessException e) {
                    throw new IllegalStateException("Can't access field!");
                }
            }
        }
    }

    private static Map<String, Field> analyze(Object object) {
        if (object == null) throw new NullPointerException();

        Map<String, Field> map = new TreeMap<String, Field>();

        Class<?> current = object.getClass();
        while (current != Object.class) {
            for (Field field : current.getDeclaredFields()) {
                if (!Modifier.isStatic(field.getModifiers())) {
                    if (!map.containsKey(field.getName())) {
                        map.put(field.getName(), field);
                    }
                }
            }
            current = current.getSuperclass();
        }
        return map;
    }
}

调用语法:

Copier.copy(sourceObject, targetObject);
 类似资料:
  • 问题内容: 所以我有: 是否有一条sql语句将所有内容从id复制到number? 我将要编写一个php scrip进行选择,然后更新每一行。我的SQL知识很基础,但是我敢肯定有一个聪明的方法可以做到这一点: 背景:ID过去一直是应用程序中显示的数字,并且是唯一的。该数字在我要添加的一些新功能中不再是唯一的-因此我需要将其移动到不唯一的字段中,同时保持旧的完整性。 问题答案: 您可以使用更新语句并引

  • 我有两个java类如下 现在我有了一个A级对象Aobj,两个字段都已初始化。我用的是小豆子。copyProperties(Bobj,Aobj),但只有字段值被复制到Bobj中。名称列表为空。有没有办法深度复制一个对象,以便它复制所有字段,包括列表、地图等集合。 我在某个地方听说了推土机,不确定这是否是为了这个目的。

  • 假设我有一个具有公共字段 和 的类 。假设我有另一个 pojo 类 ,但它使用 setter 和 getter,所以它有 setX() 和 setY()。 我想使用一些自动方法从实例复制到并返回。 至少使用默认设置,推土机的 未正确复制字段。 那么,是否有一个简单的配置更改可以让我使用Dozer或其他库来完成上述操作?

  • 我试图理解变量的范围,以及如何使用从一个类初始化的变量,并在另一个类中使用它们,但接下来我的理解就卡住了。 我有一个类Test1,定义如下: 我在我的中调用这个类: 我有另一个类Test2: 如果随后在main中调用该方法,则值val将显示为0,而不是33。如何在另一个类中访问内存中的值? 谢谢

  • 这里Book是根类,即最终的CSV将命名为books.CSV。 使用,我们只获得字段名title和author,但是我们还需要来自author类的字段名(name和age),有没有方法获得这些字段名?

  • 问题内容: 我有一堂课,基本上是另一堂课的副本。 我正在做的是在通过Web服务调用发送之前,将类中的值放入。现在,我想创建一个反射方法,该方法基本上将类(按名称和类型)相同的所有字段在类之间复制。 我怎样才能做到这一点? 到目前为止,这是我所拥有的,但效果不佳。我认为这里的问题是我试图在要遍历的字段上设置一个字段。 我敢肯定一定有人已经这样做了 问题答案: 如果您不介意使用第三方库,则Apache