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 メソッドに渡されたパラメーターの値を変更できますか? Composite オブジェクトを返したくない..

4

3 に答える 3

3

Java は参照値渡しです。つまり、オブジェクトをメソッドに渡して変更すると、メソッドの「外側」のオブジェクトも変更されます (オブジェクトは単なる参照であるため)。この例はArrays.sort、配列の呼び出しです。

ただし、これはプリミティブ ( などint) の場合には当てはまりません。この場合、Java は値渡しであるため、使用した例は機能しint Iません。の値を変更するには、メソッドからint Iを返し、それに応じて を設定する必要があります。intI

これは、メソッド内からオブジェクトの値を変更するためにリフレクションが必要ないことを意味します。ChangeValueメソッド内のオブジェクトに対して行われたすべてのことは、事実上、mainメソッドのスコープ内のオブジェクトを変更します。

于 2013-01-31T03:30:44.610 に答える
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 に答える
1

いいえ、あなたがすることはできません。

メソッドに渡すオブジェクトのプロパティは変更できますが、呼び出し元のコードのパラメーターが参照するものは変更できません。参照するもののプロパティのみです。

于 2013-01-31T03:31:49.373 に答える