Во -первых, давайте познакомимся с несколькими категориями.
Класс (java.lang.class)
Объект класса является специальным объектом, и у каждого класса есть объект класса для создания «обычного» объекта этого класса. Его можно получить с помощью метода getClass () объекта.
Например, мы запускаем эту строку кода:
Кода -копия выглядит следующим образом:
System.out.println ("test" .getClass (). ToString ());
Результат:
Кода -копия выглядит следующим образом:
класс java.lang.string
Поле (java.lang.reflect.field)
Этот класс представляет поле, которое можно использовать для доступа к классу
Далее, давайте создадим тестовый класс:
Кода -копия выглядит следующим образом:
Класс книга {
Общественная строка название;
public int length = 0;
Public ArrayList <GAGE> PAGES = NULL;
@Override
public String toString () {
String sb = "book:/n";
sb+= "title ="+title+"/n";
sb + = "length =" + length + "/n";
sb + = "pages =" + pages + "/n";
if (pages! = null) {
для (страница страницы: страницы) {
sb += page.toString ();
}
}
вернуть sb.toString ();
}
}
Страница класса {
@Override
public String toString () {
вернуть "Page/n";
}
}
Вызовите следующий метод для проверки вышеуказанного класса:
Кода -копия выглядит следующим образом:
Книга книги = новая книга ();
System.out.println (книга);
Его результатом является следующее:
Кода -копия выглядит следующим образом:
Книга:
title = null
длина = 0
Страницы = NULL
Это начальное состояние объекта книги
Мы используем механизм отражения, чтобы получить поле длины в книжном объекте и изменить его для просмотра результатов:
Кода -копия выглядит следующим образом:
Книга книги = новая книга ();
Класс <?> Aclass = book.getClass ();
Полевое поле = aclass.getfield ("длина");
Field.setint (книга, 9);
System.out.println (книга);
Вы можете видеть, что результаты бега:
Кода -копия выглядит следующим образом:
Книга:
title = null
длина = 9
Страницы = NULL
Видно, что значение поля длины было изменено.
Приведенное выше модифицированное - это простое поле int.
Кода -копия выглядит следующим образом:
Книга книги = новая книга ();
Класс <?> Aclass = book.getClass ();
Field [] fields = aclass.getFields ();
для (поле поля: поля) {
Field.SetAccessible (true);
if (field.gettype (). equals (string.class)) {
Field.set (книга, «Сказья Гримма»);
} else if (field.getType (). equals (int.class)) {
Field.Set (Book, 199);
}
}
System.out.println (книга);
Результатом вывода вышеуказанного кода является:
Кода -копия выглядит следующим образом:
Книга:
Название = сказка Гримма
длина = 199
Страницы = NULL
Фактически, все поля типа строки изменяются на «Сказку Гримма», а все поля типа INT изменяются на 199. Мы даже не знаем, что означает это поле.
Далее мы изменяем поле страниц. Это поле является ArrayList.
Кода -копия выглядит следующим образом:
Книга книги = новая книга ();
Класс <?> Aclass = book.getClass ();
Field [] fields = aclass.getFields ();
для (поле поля: поля) {
Field.SetAccessible (true);
if (field.getType (). equals (arraylist.class)) {
String genric = field.getGenericType (). ToString ();
String genricClass = genric.substring (
genric.indexof ('<' ') + 1,
genric.indexof ('>'));
Class <?> Entityclass = class.forname (genricClass);
Объект obj = entityclass.newinstance ();
ArrayList List = new ArrayList ();
list.add (obj);
Field.set (книга, список);
}
}
System.out.println (книга);
Результат вывода заключается в следующем:
Кода -копия выглядит следующим образом:
Книга:
title = null
длина = 0
Страницы = [страница
]
Страница
Можно видеть, что, хотя мы не использовали класс страницы напрямую, мы все еще создали объект страницы.
Заявление о создании объекта страницы находится в предложении: entityclass.newinstance (). Оператор NewInstance является важным методом объекта класса и используется для создания соответствующего объекта этого класса. Конечно, класс -конструктор поддерживает его. Кроме того, с помощью метода GengenericType мы можем получить тип модификатора поля. Поместите это здесь, то, что вы получаете, это ArrayList <страница>. С помощью этой строки мы можем загрузить класс страницы и создать объект страницы через класс Classer Class.forname.