我正在尝试编写一个复制方法,可以通过映射属性名将bean复制到bean。如果源对象是可克隆对象,则克隆它并尝试将其返回给调用方法。但在调用方法时,在被调用方法中所做的更改并未反映
你可能会理解,如果你看下面的代码
public class Main {
public static void main(String[] args) {
HashMap<Object, Object> source = new HashMap<Object, Object>();
source.put("test1", "test1");
source.put("test2", "test2");
source.put("test3", "test3");
HashMap<Object, Object> destination = new HashMap<Object, Object>();
Main m = new Main();
Main.beanCopy(source, destination);
System.out.println("caller - " + destination);
}
public static void beanCopy(Object source, Object destination) {
if (source.getClass() == destination.getClass()
&& Cloneable.class.isInstance(source)) {
Class<? extends Object> cl = source.getClass();
try {
Method method = cl.getDeclaredMethod("clone");
destination = method.invoke(source);
System.out.println("callee - " + destination);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
该程序的输出是
callee - {test1=test1, test2=test2, test3=test3}
caller - {}
我希望有人能帮我解决这个问题.. 提前谢谢......
答案 0 :(得分:1)
将该方法写为函数。
Object destination = Main.beanCopy(source);
public static Object beanCopy(Object source) {
return destination;
}
您的方法遇到的问题是您必须创建所需类型的实例,以便知道要复制的内容。如果你想传递所需的类型。
MyType destination = Main.beanCopy(source, MyType.class);
public static <T> T beanCopy(Object source, Class<T> clazz) {
T destination;
return destination;
}
注意:Java不支持按引用传递。 ;)
答案 1 :(得分:0)
您无法更改destination
引用的方法范围之外的内容。
您需要从方法中返回新对象。
答案 2 :(得分:0)
在beanCopy
中,destination
变量包含指向Object
的指针。通过分配
destination = method.invoke(source);
该变量现在包含指向不同对象的指针。
答案 3 :(得分:0)
如果您不是编写那些疯狂混淆的代码,而是执行此操作:
public static void beanCopy(Cloneable source, Object destination) {
if (source.getClass() == destination.getClass() {
destination = source.clone();
System.out.println("callee - " + destination);
}
}
然后问题可能会更清楚。