0

我正在用 Java 编写一个我想模拟引用的方法。由于 java 没有 C# 中的 out 关键字,也没有 C++ 中的引用/指针,我想知道我是否可以使用反射来模拟它。

一个例子是:

public static boolean ChangeValue(Object Input, Object Output) {
    //Use some reflection here to change the value of Output?
    return true;
}

然后主要:

public static void main(String[] args) {
    int I = 0;
    ChangeValue(I, I);
    System.out.println(I);
}

所以.. 我可以使用反射来更改传递给我的 ChangeValue 方法的任何参数的值吗?我不想返回复合对象..

4

3 回答 3

3

Java 是按引用值传递的,这意味着如果将 Object 传递给方法并对其进行修改,则方法“外部”的对象也将被修改(因为 Object 只是一个引用)。一个例子是调用Arrays.sort一个数组。

但是,对于原语(如int),情况并非如此,在这种情况下,Java 是按值传递的,因此您的示例int I不起作用。为了修改 的值int I,您应该int从您的方法中返回一个,并将其设置为I相应的值。

这意味着为了从方法中修改对象的值,不需要反射ChangeValue;对方法内的对象所做的任何事情,实际上都会修改main方法范围内的对象。

于 2013-01-31T03:30:44.610 回答
1

你不能。

您可以更改传递给方法的对象的属性,但不能更改调用代码的参数引用的内容——只能更改其引用的属性。

于 2013-01-31T03:31:49.373 回答
1
    public static boolean changeValue(ArrayList<String> input, ArrayList<String> output) {
        //this changes a property on output, but does not change the reference to output
        output.addAll(input);


        return true;
    }


    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<String>();
        ArrayList<String> list2 = new ArrayList<String>();

        list1.add("Foo");

        System.out.println("List 2: " + list2);
        System.out.println("List 2 size:" + list2.size());

        changeValue(list1, list2);

        System.out.println("List 2: " + list2);    
        System.out.println("List 2 size:" + list2.size());
    }

会打印...

清单 2:ArrayList@0x23409

清单 2 大小:0

清单 2:ArrayList@0x23409

清单 2 尺寸:1

于 2013-01-31T03:35:35.243 回答