Spec-Zone .ru
спецификации, руководства, описания, API
След: API Reflection
Урок: Элементы
Раздел: Поля
Получение и Установка Значений полей
Домашняя страница > API Reflection > Элементы

Получение и Установка Значений полей

Приведенный пример class, возможно использовать отражение, чтобы установить значения полей в том class. Это обычно делается только при особых обстоятельствах, когда установка значений обычным способом не возможна. Поскольку такой доступ обычно нарушает намерения проекта class, он должен использоваться с предельным усмотрением.

Book class иллюстрирует, как долгое время устанавливать значения, массив, и перечислимые типы поля. Методы для получения и установки других типов примитивов описываются в Field.


import java.lang.reflect.Field;
import java.util.Arrays;
import static java.lang.System.out;

enum Tweedle { DEE, DUM }

public class Book {
    public long chapters = 0;
    public String[] characters = { "Alice", "White Rabbit" };
    public Tweedle twin = Tweedle.DEE;

    public static void main(String... args) {
	Book book = new Book();
	String fmt = "%6S:  %-12s = %s%n";

	try {
	    Class<?> c = book.getClass();

	    Field chap = c.getDeclaredField("chapters");
	    out.format(fmt, "before", "chapters", book.chapters);
  	    chap.setLong(book, 12);
	    out.format(fmt, "after", "chapters", chap.getLong(book));

	    Field chars = c.getDeclaredField("characters");
	    out.format(fmt, "before", "characters",
		       Arrays.asList(book.characters));
	    String[] newChars = { "Queen", "King" };
	    chars.set(book, newChars);
	    out.format(fmt, "after", "characters",
		       Arrays.asList(book.characters));

	    Field t = c.getDeclaredField("twin");
	    out.format(fmt, "before", "twin", book.twin);
	    t.set(book, Tweedle.DUM);
	    out.format(fmt, "after", "twin", t.get(book));

        // production code should handle these exceptions more gracefully
	} catch (NoSuchFieldException x) {
	    x.printStackTrace();
	} catch (IllegalAccessException x) {
	    x.printStackTrace();
	}
    }
}

Это - соответствующий вывод:

$ java Book
BEFORE:  chapters     = 0
 AFTER:  chapters     = 12
BEFORE:  characters   = [Alice, White Rabbit]
 AFTER:  characters   = [Queen, King]
BEFORE:  twin         = DEE
 AFTER:  twin         = DUM

Отметьте: у Установки значения поля через отражение есть определенное количество издержек производительности, потому что различные операции должны произойти, такие как проверка допустимости прав доступа. С точки зрения времени выполнения эффекты являются тем же самым, и работа является столь атомарной, как будто значение было изменено в коде class непосредственно.

Использование отражения может заставить некоторую оптимизацию времени выполнения быть потерянной. Например, следующий код очень вероятен быть оптимизированным виртуальной машиной Java:
int x = 1;
x = 2;
x = 3;

Эквивалентное использование кода Field.set*() не может.



Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Получение и Парсинг Полевых Модификаторов
Следующая страница: Поиск и устранение неисправностей