Предисловие:
Недавно компания проходит процесс компонента бизнеса, а внедрение маршрутизации использует механизм отражения Java. Поскольку он используется, я хочу тщательно изучить и суммировать его. Фактически, будь то предыдущая версия Eventbus 2.x, модернизация или рамка раннего представления, она использует механизм отражения Java в большей или меньшей степени.
Что такое механизм отражения Java?
Механизм отражения Java заключается в том, что в состоянии бега для любого класса вы можете знать все свойства и методы этого класса; Для любого объекта вы можете вызвать любой метод его динамически приобретенного, а динамически вызов метода объекта называется механизмом отражения Java.
Какие функции обеспечивает механизм отражения?
Класс механизма отражения Java:
java.lang.class; // класс java.lang.reflect.constructor; // Метод конструктора java.lang.reflect.field; // переменная члена класса java.lang.reflect.method; // Метод класса java.lang.reflect.modifier; // Доступ к разрешениям
Реализация механизма размышлений Java:
1.) Получение объекта класса
// Первый метод состоит в том, чтобы использовать объект getClass Method Person Person = new Person (); class <?> Class1 = person.getClass (); // Второй метод состоит (Classnotfoundexception e) {e.printstacktrace ();}2.) Получить сводную информацию объекта класса
Boolean Isprimity = class1.isprimity (); // Судья, является ли это основным типом Boolean Isarray = class1.isarray (); // Судья, является ли это классом класса коллекции Boolean Isannotation = class1.isannotation (); // Судья, является ли это аннотационным классом boolean isInterface = class1.isInterface (); class1.isenum (); // Судья, является ли это булевым классом Enum boolean isAnonymousclass = class1.isanonymousclass (); // Судья, является ли это анонимным внутренним классом Boolean Isannotationpresent = class1.isannotationpresent (repecation.class); // Судья - это модифицированное с помощью определенного класса. Содержит пакет пакета имени пакета Apackage = class1.getPackage (); // Получить информацию о пакете класса string strameName = class1.getSimplEname (); // Получить имя класса класса int modifiers = class1.getModifiers (); // get Class Access Class Class <?> [] declaredClasses = class1.colarslass <= //nner class Class. Class1.getDeclaringClass (); // Внешний класс
3.) Получите атрибуты, методы, конструкторы и т. Д. Объекта класса
Field [] allfields = class1.getDeclaredFields (); // Получить все атрибуты поля объекта класса [] publicFields = class1.getFields (); // Получить общедоступный атрибут объекта класса Try {Field Agefield = class1.getDeclaredfield («Возраст»); // Получить указанный атрибут поля. Атрибут класса} catch (nosuchfieldexception e) {e.printstacktrace ();} метод [] методы = class1.getDeclaredMethods (); // Получить все методы объявления объекта класса [] allmethods = class1.getmethods (); // Получить все методы класса, включая метод класса родительского класса. Класс класса объекта класса <?> [] Interfaceclasses = class1.getInterfaces (); // Получить все интерфейсы Class Object Constructor <?> [] allConstructors = class1.getDeclaredConstructors (); // Получить все конструкторы объявления класса объекта Constructor <?> [] publicCountors = class1.gretructors () classorructors;//class -classructors; // gate pullestructors (); Constructor <?> Constructor = class1.getDeclaredConstructor (новый класс [] {string.class}); // Получить указанный конструктор объявления publicConstructor = class1.getConstructor (new Class [] {}); // Получить указанное объявление Public Constructor} Catch (nosuchmeteDexcept e.printstacktrace ();} аннотация [] аннотации = class1.getannotations (); // Получить все аннотации аннотации объекта класса = class1.getannotation (rececated.class); // Получить указанную аннотацию класса объекта genericsuperclass = class1.getgenericsuperclass (); Class1.getGenericInterfaces (); // Получить коллекцию типов всех интерфейсов объекта класса 4.) Динамическая генерация объектов класса
// Первый метод класса объекта вызывает метод newInstance () для генерации объекта obj = class1.newinstance (); // Второй метод объекта получает соответствующий объект конструктора, а затем генерирует конструктор <?> Constructor = class1.getDeclaredConstructor (новый класс [] {String.class}); // get SpecledConstructor (новый класс [] {String.class}); constructor.newinstance (новый объект [] {"lcj"});5.) Функции динамического вызова
try {// генерировать новый объект: используйте метод newInstance () объект obj = class1.newinstance (); // судить, является ли объект подклассом личностного логического iSinstanceOf = obj InstactOf Person; // Во -первых, вам необходимо получить метод, соответствующий методу метода метода = class1.getDeclaredMethod ("setge", новый класс [] {int.class}); // вызовуте указанную функцию и пропустите метод параметров.invoke (obj, 28); method = class1.getDeclaredMethod ("getage"); Object result = method.invoke (obj, new Class [] {});} catch (instantiationException e) {e.printstacktrace ();} catch (allogalaccessexception e) {e.printstacktrace ();} catch (nosuchmethodexcept e.printstacktrace ();} 6.) Получить общие типы с помощью механизма отражения
Например, следующая структура
// People Class Public Class People <T> {} // Человек класс наследует люди класс общедоступного класса Person <t> расширяет People <string> реализует PersonInterface <Integer> {} // inderniterface interface personite interface <t> {}Получите общие типы
Person <string> person = new Person <> (); // Первый путь - это использовать класс MeTHOL GetClass <?> Class1 = person.getClass (); Type genericsuperclass = class1.getGenericSuperClass (); // Получить typetype [] interfacetypes = class1.getGenericInterface (); // Получить набора всех интерфейсов класса объекта getComponentType (genericSclass); getComponentType (Interfacetypes [0]);
getComponentType реализация
Private Class <?> getComponentType (тип типа) {class <?> componenttype = null; if (type instanceOf parameterizedType) {// getActualtyPearguments () Возвращает массив объектов типа, представляющие фактические параметры типа этого типа. Type [] factiontypearguments = ((parameterizedtype) тип). GetactualtyPearguments (); if (factiontypearguments! = null && factiontypearguments.length> 0) {componenttype = (class <?>) ActualTyPearguments [0]; }} else if (экземпляр типа genericArrayType) {// тип массива, который представляет тип элемента, который является параметризованным типом или типом переменной componenttype = (class <?>) ((GenericArrayType) тип) 6.) Получить информацию о аннотации с помощью механизма отражения
Здесь мы сосредоточены на получении информации о аннотации метода в качестве примера
try {// Во -первых, вам нужно получить объект метода, соответствующий методу этого метода = class1.getDeclaredMethod ("jumptogoodsdetail", новый класс [] {string.class, string.class}); Аннотация [] аннотации1 = method.getannotation (); // Получить все методы аннотации аннотации аннотации1 = метод.getannotation (routeruri.class); // Получить указанную информацию о аннотации typevariable [] typevariables1 = method.gettypeparameters (); Annotation [] [] ParameterannotationsArray = method.getParameterannotations (); // Получить все параметры аннотации класс информации <?> [] Parametertypes = method.getParameterTypes (); // Получить все параметры типа класса [] genericParameterTypes = method.getGenericPARAMETERTYPES (); // Получить All Parameters types = method.getGenericParePes (); method.getReturnType (); // Получить возвратный тип метода int modifiers = method.getModifiers (); // Получить разрешения доступа метода} catch (nosuchmethodexception e) {e.printstacktrace ();}Сценарии применения механизма отражения:
Преимущества и недостатки механизма отражения:
Преимущества: суждение типа времени выполнения, динамическая нагрузка класса и динамическое отражение использования прокси.
Недостатки: производительность - это проблема. Отражение эквивалентно ряду объяснений. Уведомляя JVM о том, что делать, производительность намного медленнее, чем прямой код Java.
Суммировать:
Механизм отражения Java редко используется в повседневной разработке бизнеса, но он широко используется при построении некоторых основных рамок. Сегодня я кратко суммировал и узнал об этом, и есть еще много неизвестных знаний, которые можно использовать позже, чтобы дополнить его.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.