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
Нет, ты не можешь.
Вы можете изменить свойства объектов, которые вы передаете методу, но вы не можете изменить то, на что ссылается параметр вызывающего кода - только свойства того, на что он ссылается.