通过Value并引用Java

时间:2011-04-11 18:28:25

标签: java

我正在尝试编写一个复制方法,可以通过映射属性名将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 - {}

我希望有人能帮我解决这个问题.. 提前谢谢......

4 个答案:

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

该变量现在包含指向不同对象的指针。

Java is Pass-by-Value, Dammit!

答案 3 :(得分:0)

如果您不是编写那些疯狂混淆的代码,而是执行此操作:

public static void beanCopy(Cloneable source, Object destination) {
    if (source.getClass() == destination.getClass() {
        destination = source.clone();
        System.out.println("callee - " +  destination);             
    }
}

然后问题可能会更清楚。