Java отражение, чтобы изменить параметр?

Я пишу метод в Java, который я хочу имитировать ссылки. Поскольку у Java нет ключевого слова out, как в C#, и нет ссылок / указателей, как в 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? Я не хочу возвращать составные объекты..

3 ответа

Решение

Java - это значение, передаваемое по ссылке, что означает, что если вы передадите объект методу и измените его, объект "вне" метода также будет изменен (поскольку объект просто является ссылкой). Примером этого является призыв Arrays.sort на массиве.

Однако это не относится к примитивам (например, int), в этом случае Java передается по значению, поэтому ваш пример с int I не сработает. Для того, чтобы изменить значение int I, вы должны вернуть int от вашего метода, и установите его в I соответственно.

Это означает, что отражение не требуется для изменения значения объекта изнутри ChangeValue Способ; все, что сделано с объектом в методе, по сути, изменит объект в области действия main метод.

    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

Нет, ты не можешь.

Вы можете изменить свойства объектов, которые вы передаете методу, но вы не можете изменить то, на что ссылается параметр вызывающего кода - только свойства того, на что он ссылается.

Другие вопросы по тегам