Отражение — важная особенность языка Java. Мы знаем, что перед использованием класса мы часто его уже создали, например, создав файл класса, а затем написав некоторые атрибуты, методы и т. д., то есть такого рода класс. Он статический, но механизм отражения позволяет создавать класс динамически. Помимо динамического создания класса, мы также можем динамически получать данные о похожих объектах и присваивать эти данные вновь созданному классу, что чем-то похоже на клонирование. Часто нам нужна эта функция динамического создания классов. Например, при обработке некоторых предприятий, но эти предприятия немного отличаются, они часто соответствуют нескольким классам. При обработке нам приходится основываться на разных бизнес-обработках для вызова разных классов. на этот раз нам пригодится механизм отражения.
Ниже приводится описание пакета java.lang.reflect в JDK API:
Предоставляет классы и интерфейсы для получения информации о классах и объектах. В рамках ограничений безопасности отражение обеспечивает программный доступ к информации о полях, методах и конструкторах загруженного класса, а также позволяет использовать отраженные поля, методы и конструкторы для работы с базовыми эквивалентами объекта.
AccessibleObject позволяет подавлять проверки доступа, если доступен требуемый ReflectPermission.
Массивы предоставляют статические методы для динамического создания массивов и доступа к ним.
Классы в этом пакете, а также java.lang.Class можно адаптировать к потребностям таких приложений, как отладчики, интерпретаторы, инспекторы объектов, браузеры классов и сервисы (такие как сериализация объектов и JavaBeans), которым необходим доступ к целевому объекту. объекты, основанные на общедоступных членах своего класса времени выполнения) или членах, объявленных данным классом).
Ниже приведены два простых примера, иллюстрирующих использование отражения. Сначала создайте класс Person:
Скопируйте код кода следующим образом:
тест упаковки;
общественный класс Person {
частный возраст;
частное имя строки = "";
частная String[] arr = новая строка[2];
публичный человек(){}
public Person(String name,int age){
это.имя = имя;
this.age = возраст;
}
общественный int getAge() {
возвратный возраст;
}
public void setAge(int age) {
this.age = возраст;
}
публичная строка getName() {
вернуть имя;
}
public void setName (имя строки) {
это.имя = имя;
}
общественная строка [] getArr() {
возврат обр;
}
public void setArr(String[] arr) {
this.arr = arr;
}
}
Пример 1. Получите атрибуты и информацию о методе класса Person. Скопируйте код следующим образом:
частная статическая пустота testSimpleReflect(){
String className = "test.Person";
пытаться {
Класс c = Class.forName(имякласса);
Field[] поля = c.getDeclaredFields();
Метод [] m = c.getDeclaredMethods();
for (Поле поля: поля){
System.out.println(field.getName());
}
for (Метод: m){
System.out.println(m.getClass());
}
} catch (ClassNotFoundException e) {
е.printStackTrace();
}
}
Это очень просто. Вы можете получить класс через путь к пакету, где находится класс. В реальной работе он также наиболее часто используется.
Пример 2: Копирование объекта. Копирование кода. Код выглядит следующим образом:
@SuppressWarnings («не отмечено»)
публичная статическая копия объекта (объект объекта) выдает исключение {
// Получаем тип объекта
Класс classType = object.getClass();
System.out.println("" + classType.getName()); // Создаем новый объект с помощью метода построения по умолчанию.
Объект objectCopy = classType.getConstructor(новый класс[] {})
.newInstance(new Object[] {} // Получаем все свойства объекта
Поля полей[] = classType.getDeclardFields();
for (int i = 0; i <fields.length; i++) {
Поле поле = поля[i];
Строка fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase() // Получаем имя метода getXXX(), соответствующего атрибуту;
String getMethodName = "get" + firstLetter + fieldName.substring(1) // Получаем имя метода setXXX(), соответствующего атрибуту;
String setMethodName = "set" + firstLetter + fieldName.substring(1 // Получаем метод getXXX(), соответствующий атрибуту);
Метод getMethod = classType.getMethod(getMethodName,
new Class[] {}); // Получаем метод setXXX(), соответствующий атрибуту
Метод setMethod = classType.getMethod(setMethodName,
new Class[] { field.getType() }); // Вызов метода getXXX() исходного объекта
Значение объекта = getMethod.invoke(object, new Object[] {});
System.out.println(fieldName + ":" + value // Вызов метода setXXX() скопированного объекта);
setMethod.invoke(objectCopy, новый Object[] {значение});
}
вернуть объектCopy;
}
Используя отражение для копирования объектов, нам обычно не нужно делать это самостоятельно, поскольку система с открытым исходным кодом BeanUtils уже инкапсулировала для нас копию объекта. Мы можем просто вызвать ее метод напрямую, но стоит отметить, что BeanUtils также основан на этом. на механизме отражения Сделать пакет.
Вот звонок:
Скопируйте код кода следующим образом:
public static void main(String[] args){
Человек человек = новый Человек("том",22);
String[] strs = новая String[]{"a","b"};
person.setArr(strs);
пытаться {
Человек p = (Человек) копия (человек);
System.out.println(p.getName()+">>"+p.getAge());
for (String str: p.getArr()){
System.out.println(str);
}
} catch (Исключение е) {
е.printStackTrace();
}
// testSimpleReflect();
}