Многие основные платформы используют технологию отражения. Например, платформа ssh использует две технологии: XML в качестве файла конфигурации + технология отражения.
Пакеты классов, связанные с отражением.
java.lang.reflect.* и java.lang.Class;
Все типы в Java (включая базовые типы) соответствуют объекту класса, и этот класс — java.lang.Class. То есть у каждого типа есть соответствующий ему объект класса, у класса нет открытого конструктора. Обратите внимание, что дело не в том, что нет публичного доступа.
Как получить объект класса
Скопируйте код кода следующим образом:
.Для каждого объекта object.getCalss() вы можете получить соответствующий класс.
.Class.forName(String), метод записи строки: имя пакета.имя класса. Будет создан объект, соответствующий имени пакета.имя класса. Примечание. 1.2 применяется только к ссылочным типам.
.Для базовых типов: класс инкапсуляции TYPE представляет объект класса соответствующего базового типа Integer.TYPE соответствует объекту класса int. Примечание. 3 применяется только к базовым типам.
.Тип, Класс. <Тип 4 является универсальным.>
Из четырех вышеперечисленных методов только метод 2 является динамическим. Просто измените пакет. Он имеет динамический потенциал. Поэтому, если вы хотите по-настоящему реализовать динамическое программирование, вы можете использовать только метод 2.
Существует только один объект класса каждого типа, то есть у них только один адрес, но разные типы разные.
Таким образом, все следующие результаты печати верны.
Скопируйте код кода следующим образом:
//Парные и ссылочные типы
Класс c1 = "".getClass();
Класс c2 = Class.forName("java.lang.String");
Класс c3 = String.class;
System.out.println(c1 ==c2);//true
//Для базовых типов
Класс номер1 = Целое число.ТИП;
Класс номер2 = int.class;
System.out.println(num1 == num2);//true
Отражение для получения связанных методов членов класса
[Получить структуру <в соответствии с типом параметра>] (обычно используется без объявления)
Скопируйте код кода следующим образом:
Конструктор<T> getConstructor(Класс<?>... Типы параметров)
Возвращает объект Constructor, который отражает указанный открытый конструктор класса, представленного этим объектом Class.
Конструктор<?>[] getConstructors()
Возвращает массив, содержащий объекты Constructor, которые отражают все общедоступные конструкторы класса, представленного этим объектом Class.
Конструктор<T> getDeclardConstructor(Класс<?>... Типы параметров)
Возвращает объект Constructor, который отражает указанный метод конструктора для класса или интерфейса, представленного этим объектом Class.
Конструктор<?>[] getDeclaredConstructors()
Возвращает массив объектов Constructor, которые отражают все методы конструктора, объявленные классом, представленным этим объектом Class.
[Получить атрибут <в соответствии с именем атрибута>] (обычно используется с объявленным, поскольку атрибуты обычно являются частными)
Скопируйте код кода следующим образом:
Поле getField (имя строки)
Возвращает объект Field, который отражает указанные общедоступные поля-члены класса или интерфейса, представленного этим объектом Class.
Поле[] getFields()
Возвращает массив, содержащий объекты Field, которые отражают все доступные общедоступные поля класса или интерфейса, представленного этим объектом Class.
Поле getDeclaredField (имя строки)
Возвращает объект Field, который отражает указанное объявленное поле класса или интерфейса, представленного этим объектом Class.
Поле[] getDeclaredFields()
Возвращает массив объектов Field, которые отражают все поля, объявленные классом или интерфейсом, представленным этим объектом Class.
[Метод получения <имя метода плюс тип параметра>] (обычно используется без объявления)
Скопируйте код кода следующим образом:
Метод getMethod (имя строки, класс <?>... Типы параметров)
Возвращает объект метода, который отражает указанный открытый метод-член класса или интерфейса, представленного этим объектом класса.
Метод[] getMethods()
Возвращает массив, содержащий объекты метода, которые отражают общедоступные члены класса или интерфейса, представленные этим объектом класса (включая те, которые объявлены этим классом или интерфейсом, а также унаследованные от суперклассов и суперинтерфейсов).
Метод getDeclardMethod (имя строки, класс <?>... Типы параметров)
Возвращает объект Method, который отражает указанный объявленный метод класса или интерфейса, представленного этим объектом Class.
Метод[] getDeclaredMethods()
Возвращает массив объектов Method, которые отражают все методы, объявленные классом или интерфейсом, представленным этим объектом Class, включая общедоступные, защищенные, методы доступа по умолчанию (пакета) и частные методы, но исключая унаследованные методы.
Т новыйЭкземпляр()
Создает новый экземпляр класса, представленного этим объектом Class. <new Instance() может динамически создавать объекты>
Строка toString()
Преобразовать объект в строку.
Уведомление: newInstance() вызывает конструктор без параметров. Если у класса нет конструктора без параметров, newInstance() сгенерирует исключение.
Объявленные методы поддерживают конфиденциальность, но не поддерживают наследование. Необъявленные методы поддерживают наследование, но не поддерживают конфиденциальность и могут удалять только общедоступные данные.
Поэтому свойства обычно объявляются с объявлением, поскольку свойства обычно являются частными, методы обычно получаются без объявления, а конструкторы обычно получаются без объявления.
Отражение моделирования экземпляра получает соответствующие свойства и методы в классе.
Использование отражения для присвоения значений свойствам
Методы в полевых условиях
Получить объект (Объект obj)
Возвращает значение поля, представленного этим полем в указанном объекте.
Поле f = c.getXXField(имя свойства);
значение = f.get(объект);
void set (объект объекта, значение объекта)
Устанавливает для поля, представленного этим объектом Field в указанной объектной переменной, указанное новое значение.
f.set(объект, значение);
Класс<?> getType()
Возвращает объект Class, который идентифицирует объявленный тип поля, представленного этим объектом Field.
Используется для получения типа атрибута (возвращает объект класса).
Скопируйте код кода следующим образом:
Класс c = Студент.класс;
Object obj = c.newInstance(); //Создаем объект класса Student.
Поле f = c.getDeclardField("name"); //Получаем атрибут имени
f.setAccessible(true); //Устанавливаем частный доступ.
f.set(obj, "Чжансан");
System.out.println(f.get(obj)); //Получаем значение атрибута имени объекта.
Использование отражения для вызова конструкций Фактический вызов конструктора происходит при вызове метода newInstance().
Скопируйте код кода следующим образом:
Класс c = Class.forName("com.clazz.reflect.Student");
Constructor con = c.getConstructor(); //Построение не выполняется,
Object cObj = c.getConstructor().newInstance();//Вызов конструктора без параметров
Конструктор conAll = c.getConstructor(int.class,String.class,int.class);
Object caobj = conAll.newInstance(1001,"zjamgs",234235);//Вызов конструктора с параметрами.
System.out.println(caobj); //Вывод на печать
Вызов методов с использованием отражения Имя объекта.Метод(значение 1,2,3);
Метод m = c.getMethoed(имя метода, тип параметра...);
m.invoke (объект, параметры вызова метода). Если формальный параметр, требуемый базовым методом, равен 0, длина предоставленного массива args может быть равна 0 или нулевому значению.
Скопируйте код кода следующим образом:
Класс c = Class.forName("com.clazz.reflect.Student");
Object obj = c.newInstance(); //Создаем объект Sutdent.
Метод msetName = c.getMethod("setName", String.class);//obj не нужно преобразовывать тип
msetName.invoke(obj, "zhangsan");//Вызов метода setName и передача параметров.
Метод msetId = c.getMethod("setId", int.class);
msetId.invoke(obj, 409090202);
System.out.println(объект);
Примеры применения отражения Класс сущности
Скопируйте код кода следующим образом:
пакет org.dennisit.reflect.entity;
импортировать java.io.Serializable;
/**
*
*Пользователь.java
*
* @версия: 1.1
*
* @author: Су Руонян<a href="mailto:
[email protected]">Отправить письмо</a>
*
* @since: 1.0 Время создания: 2013-2-26 13:43:56
*
* TODO: класс User.java используется для...
*
*/
Пользователь публичного класса реализует Serializable{
частный строковый тест;
public void выполнить (имя строки, возраст int) {
System.out.println("name=" + name + ",age=" + age);
}
}
Класс тестирования на отражение
Скопируйте код кода следующим образом:
пакет org.dennisit.reflect.main;
импортировать java.lang.reflect.Field;
/**
*
* ReflectEx.java
*
* @версия: 1.1
*
* @author: Су Руонян<a href="mailto:
[email protected]">Отправить письмо</a>
*
* @since: 1.0 Время создания: 26 февраля 2013 г., 13:46:00.
*
* TODO: класс ReflectEx.java используется для...
*
*/
общественный класс ReflectEx {
public static void main(String[] args) выдает исключение {
Класс cls = Class.forName("org.dennisit.reflect.entity.User");
Object obj = cls.newInstance(); //Создаем объект пользователя.
Поле f = cls.getDeclaredField("test"); //Получаем тестовый атрибут
f.setAccessible(true); //Разрешения на открытый доступ для проверки частного атрибута
f.set(obj, "zhangsan"); //Копируем еще раз для проверки.
System.out.println(f.get(obj)); //Получаем значение тестового атрибута obj
//Получаем метод на основе имени метода
java.lang.reflect.Method m = cls.getMethod("выполнить", String.class, int.class);
m.invoke(obj, "dennisit",23); //Вызов метода выполнения;
}
}
Эффект операции
Скопируйте код кода следующим образом:
Чжансан
имя=деннисит,возраст=23
Пример написания отражающего динамического класса создания экземпляров
Скопируйте код кода следующим образом:
пакет org.dennisit.reflect.main;
импортировать java.lang.reflect.Field;
импортировать java.lang.reflect.Method;
импортировать java.util.Map;
импортировать java.util.Set;
/**
*
* DynamicReflect.java
*
* @версия: 1.1
*
* @author: Су Руонян<a href="mailto:
[email protected]">Отправить письмо</a>
*
* @since: 1.0 Время создания: 26 февраля 2013 г., 13:58:12.
*
* TODO: пример динамического создания экземпляра с использованием отражения.
*
*/
общественный класс DynamicReflect {
общедоступный статический объект getInstance (String className, Map <String, Object> map) выдает исключение {
Класс c = Class.forName(имякласса);
Объект obj = c.newInstance(); //Объект объекта
Set<String>keys = map.keySet(); //Получаем все соответствующие атрибуты
Field[] fAll = c.getDeclaredFields(); //Получаем все свойства класса
for(int i=0;i<fAll.length;i++){
for(String key:keys){ //Сопоставление цикла
if(fAll[i].getName().equals(key)){ //Если атрибут, переданный пользователем, соответствует имени атрибута в полученном классе
Поле f = c.getDeclardField(key);//Получить этот атрибут
//Создаем имя метода setXxx()
String MethodName = "set" + key.substring(0,1).toUpperCase()+key.substring(1);
Метод метод = c.getMethod(methodName, f.getType());//Получаем соответствующий метод на основе построенного имени пользователя
метод.invoke(obj, map.get(key));//Вызов метода
}еще{
продолжать;
}
}
}
вернуть объект;
}
}
Далее мы тестируем написанный нами пример создания экземпляра динамического отражения.
Класс сущности
Скопируйте код кода следующим образом:
пакет org.dennisit.reflect.entity;
импортировать java.io.Serializable;
/**
*
*Пользователь.java
*
* @версия: 1.1
*
* @author: Су Руонян<a href="mailto:
[email protected]">Отправить письмо</a>
*
* @since: 1.0 Время создания: 2013-2-26 13:43:56
*
* TODO: класс сущности
*
*/
Пользователь публичного класса реализует Serializable{
частное имя строки;
частный возраст;
личная строка электронной почты;
public User() { //Не должно быть конструктора параметров
}
//геттер() и сеттер()
}
Основной тестовый класс
Скопируйте код кода следующим образом:
пакет org.dennisit.reflect.main;
импортировать java.util.HashMap;
импортировать java.util.Map;
импортировать org.dennisit.reflect.entity.User;
/**
*
* ReflectEx.java
*
* @версия: 1.1
*
* @author: Су Руонян<a href="mailto:
[email protected]">Отправить письмо</a>
*
* @since: 1.0 Время создания: 26 февраля 2013 г., 13:46:00.
*
* TODO: класс ReflectEx.java используется для...
*
*/
общественный класс ReflectEx {
public static void main(String[] args) выдает исключение {
Класс cls = Class.forName("org.dennisit.reflect.entity.User");
String className = "org.dennisit.reflect.entity.User";
Map<String,Object> map = new HashMap<String, Object>();
map.put("имя", "деннисит");
map.put("возраст", 22);
map.put("электронная почта", "[email protected]");
Пользователь user = (Пользователь)DynamicReflect.getInstance(имякласса, карта);
System.out.println(user.getName() + "," + user.getAge() + "," + user.getEmail());
}
}
Результаты запуска программы
Скопируйте код кода следующим образом: