gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:06:22 24 4
gpt4 key购买 nike

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

有很大关系

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

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 传递给 assign(...) 方法,那么它将执行 aa.x=bb.x赋值。

希望这已经足够清楚了。必须有更好的方法来解释这一点。如果有人知道,请编辑帖子(+标题)以使其更清楚(但保留我的想法)..

如果有办法实现这一点,请告诉我。

谢谢!

最佳答案

Dozer 很好,请参阅 Jean-Remy 的回答。

此外,如果变量根据 JavaBeans 标准具有 getter 和 setter,则有许多技术可以帮助您,例如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());
}

更新:

如果您没有 getter 和 setter,这里有一个快速技巧,可以将字段值从一个类复制到另一个类,只要字段具有通用名称和类型即可。我还没有测试过,但作为起点应该没问题:

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

关于java - 将一个类的字段复制到另一个类的相同字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11900429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com