1. Что такое отражение?
Класс имеет несколько компонентов, таких как переменные -члены, методы, конструкторы и т. Д.
Отражение состоит в том, чтобы загрузить класс и рассечь различные компоненты класса.
2. Загрузка класса
В Java есть класс, который представляет байт -код определенного класса.
Поскольку класс класса представляет байт -код определенного класса, он должен обеспечить загрузку определенного класса.
Метод Bytecode: ForName ().
в память и инкапсулируйте с помощью объектов класса.
Еще два способа получить объекты класса:
Название класса.class
Object.getClass ()
Сначала создайте простой класс человека
Кода -копия выглядит следующим образом:
открытый класс RefertDemo {
Public Static Void Main (String Args []) бросает исключение
{// 1.
Класс clazz = class.forname ("dsa.person");
// 2.
Класс clazz1 = новый человек (). GetClass ();
// 3.
Classclazz2 = person.class;
}
}
3. Метод строительства отражения
Лично класс:
Кода -копия выглядит следующим образом:
/**
*Строительный метод
*/
publicperson () {
System.out.println ("null");
}
publicperson (StringName) {
System.out.println (имя);
}
Publicperson (StringName, Intpwd) {
System.out.println (name+"+"+pwd);
}
PrivatePerson (список) {
System.out.println ("List");
}
В тестовом классе:
Кода -копия выглядит следующим образом:
// Reflection Publicperson ()
@Тест
publicvoidtest1 () throwsexception {
Classclazz = class.forname ("rflectordemo.person");
Constructorcr = clazz.getConstructor (null); // Получить объект конструктора
Personp = (человек) cr.newinstance (null); // создание объекта через конструктор
//System.out.println(p.name);
}
// Reflection Publicperson (StringName)
@Тест
publicvoidtest2 () throwsexception {
Classclazz = class.forname ("rflectordemo.person");
Constructorcr = clazz.getConstructor (String.class);
Personp = (человек) cr.newinstance ("хаха");
System.out.println (p.name);
}
// Reflection Publicperson (StringName, Intpwd)
@Тест
publicvoidtest3 () throwsexception {
Classclazz = class.forname ("rflectordemo.person");
Constructorcr = clazz.getConstructor (string.class, int.class);
Personp = (человек) cr.newinstance ("хаха", 1);
//System.out.println(p.name);
}
// Reflection Publicperson (список списков)
@Тест
publicvoidtest4 () throwsexception {
Classclazz = class.forname ("rflectordemo.person");
Constructorcr = clazz.getDeclaredConstructor (list.class);
Cr.SetAccessible (true); // грубое растрескивание силы
Personp = (человек) cr.newinstance (newarraylist ());
System.out.println (p.name);
}
// Другой способ создания объектов применим только к созданию методов без параметров
@Тест
publicvoidtest5 () throwsexception {
Classclazz = class.forname ("rflectordemo.person");
Personp = (человек) clazz.newinstance ();
System.out.println (p.name);
}
Когда метод строительства является частным, мы будем грубые трещины! ! !
4. Обычные методы размышления
Лично класс:
Кода -копия выглядит следующим образом:
/**
*Метод
*/
publicvoidjf ()
{
}
publicvoidjf (StringName, Intpwd)
{
}
publicclass [] jf (stringname, int [] pwd)
{
returnNewClass [] {string.class, int.class};
}
privatevoidjf (inputstreamin)
{
System.out.println (in);
}
publicstaticvoidjf (intnum)
{
System.out.println (num);
}
publicstaticvoidmain (Stringargs [])
{
System.out.println ("main !!!");
}
В тестовом классе:
Кода -копия выглядит следующим образом:
/**
*Рефлексивный метод
*
*@authortanlvxu
*
*/
publicClassDemo2 {
// Метод класса отражения: publicvoidjf ()
@Тест
publicvoidtest1 () throwsexception {
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
Methodmethod = clazz.getMethod ("Jf", null);
method.invoke (p, null);
}
// Метод класса отражения: publicvoidjf (stringName, intpwd)
@Тест
publicvoidtest2 () throwsexception {
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getMethod ("jf", string.class, int.class);
Method.invoke (P, "DSA", 30);
}
// Метод класса отражения: publicclass [] jf (stringName, int [] pwd)
@Тест
publicvoidtest3 () throwsexception {
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getMethod ("jf", string.class, int []. Class);
Classcs [] = (class []) method.invoke (p, "aads", newint [] {1,2,3});
System.out.println (cs [0]);
}
// Метод класса отражения: privatevoidjf (inputstreamin)
@Тест
publicvoidtest4 () throwsexception {
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getDeclaredMethod ("jf", inputStream.class);
method.setAccessible (true);
method.invoke (p, newfileinputstream ("d: //qqclient.txt"));
}
// Метод класса отражения: publicstaticvoidjf (intnum)
@Тест
publicvoidtest5 () throwsexception {
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getMethod ("Jf", int.class);
method.invoke (null, 30);
}
// Метод класса отражения: publicstaticvoidm (intnum)
@Тест
publicvoidtest6 () throwsexception {
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getMethod ("main", string []. Class);
//method.invoke(null,(Object)NewString="sds","das "});
method.invoke (null, newobject [] {newstring [] {"ds", "das"}});
}
5. Поля отражения
Лично класс:
Кода -копия выглядит следующим образом:
/**
*Поле
*/
publicsTringName = "swr";
privateintPassword = 45;
PrivateStaticIntage = 35;
В тестовом классе:
Код Java
/**
*Рефлексивные классовые поля
*@authortanlvxu
*
*/
publicClassDemo3 {
/**
*Field Field PublicsTringName = "swr";
*@throwsexception
*/
@Тест
publicvoidtest1 () throwsexception
{
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
Fieldf = clazz.getfield ("имя");
// Получить значение поля
ObjectValue = f.get (p);
// Получить тип поля
Classtype = f.gettype ();
if (type.equals (string.class)) {
StringName = (string) f.get (p);
System.out.println (имя);
}
// Установить значение поля
F.Set (P, "DFAFA");
System.out.println (p.name);
}
/**
*Поле отражения privateintpassword;
*@throwsexception
*/
@Тест
publicvoidtest2 () throwsexception
{
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
Fieldf = clazz.getDeclaredfield ("пароль");
f.setAccessible (true);
F.Set (P, 36);
System.out.println (f.get (p));
}
/**
*Поле отражения PrivateStaticIntage = 35;
*@throwsexception
*/
@Тест
publicvoidtest3 () throwsexception
{
Classclazz = class.forname ("rflectordemo.person");
Fieldf = clazz.getDeclaredfield ("Age");
f.setAccessible (true);
F.Set (NULL, 24);
System.out.println (f.get (null));
}
На самом деле, независимо от метода построения отражения или поля, мы можем извлечь из него один за другим!