Пълно ръководство за Java API размисъл

В тази статия ще разгледаме всички елементи и функционалност на Reflection API на Java.

Отражение в Java - е механизмът, чрез който можете да правите промени и да получи информация за класове, интерфейси, полета и методи по време на изпълнение, без да знае имената на класове, методи и области. В допълнение, Reflection API ви позволява да създавате нови случаи на класове, обадете се на методи и да получите или да зададете стойности за тези полета.

Начинаещи Java програмисти често се бъркат с отражение самоанализ. Интроспекция - проверка код и възможността да видите типовете обекти по време на изпълнение. Отражение дава възможност да се правят промени по време на програмата чрез използването на самоанализ. Важно е да се разбере разликата, защото някои езици поддържат самоанализ, но не поддържат размисъл, например, C ++.

В това ръководство ще разгледаме не само основните, но и по-разширени функции Reflection API.

Java Reflection API

Reflection - мощен концепция, която се намира в сърцето на най-модерните Java / Java EE рамки и библиотеки. Например, за класическите примери на Java, са:

  • JUnit - рамка за единица тестване. Тя използва отражение да се анализира анотация (например, @Test) за получаване на методите за изпитване, описани програмист и освен тяхната ефективност.
  • Пролет - рамка за разработване на приложения върху платформата Java, в която се основава на инжектирането на зависимост (Инверсия на контрол).

Списъкът е безкраен: от уеб контейнера за да отговори на предизвикателствата на обектно-релационни съответствия (ORM). Всички те имат едно нещо: те използват Java размисъл, тъй като те нямат достъп и представяне на потребителски дефинирани класове, методи, интерфейси и т.н.

Ограничения на отражението в Java

Защо трябва да не се използва размисъл по обичайния програмирането, когато има достъп до интерфейсите и класове. Има няколко причини:

Java Reflection: Работа с класове

Java.lang.Class обект е входната точка за всички операции на отражение. За всеки тип обект, на JVM създава неизменна копие от java.lang.Class която осигурява методи за извличане на свойства на даден обект, да създавате нови обекти, да се позове методи.

В този раздел, ние обсъждаме важни техники при работа с java.lang.Class:

  • Всички видове в Java, включително примитивни типове и масиви имат асоцииран java.lang.Class обект. Ако знаете името на класа по време на компилация, можете да получите на обекта, както следва:

При използване на метод Class.forName (), трябва да се уточни напълно определено име на клас. Това е името на класа, включително имена на пакети. Например, ако SomeObject е в com.javadevblog.app пакет. пълното име на класа си е низ: com.javadevblog.app.SomeObject.

Class.forName () метод може да се хвърли изключение ClassNotFoundException ако класът не е намерена в CLASSPATH по време на изпълнение.

Качваме се на името на класа

С помощта на обекта клас можем да получим името на класа по два начина:

getName () метод. което ще се върне напълно определено име на клас с опаковката:

А клас може да реализира много интерфейси. Ето защо, тя се връща масив от клас обекти. Reflection API интерфейси на Java също са представени от обекти клас.

Забележка. Метод върна само интерфейси, които реализира за съответния клас, вместо да му суперкласа. За да получите пълен списък на интерфейси, прилагани от този клас, трябва да се прилага както за текущия клас, както и да му суперкласа.

Отражение в Java: строителите

Тъй като можете да получите информация за конструктора на класа, като се използва Java Reflection API и създаване на обекти по време на изпълнение. Това се прави с помощта на Java java.lang.reflect.Constructor клас.

Качваме се на класа конструктор

Това означава, че вместо един обект повикване objectToInvokeOn уточни нула.

Java Reflection API: Методи за определяне и получаване на стойностите на

В допълнение към традиционните методи на класа, ние може да работи и с GET и определя методи, използвайки размисъл. Вземете тези методи по няколко начина: изрично да се уточни кариерист или инкубатора на работа или да се придвижва всички налични методи в класната стая и да ги провери, ако те са методи получат или да зададете:

За да определите кариерист или сетер, ние трябва да се определят някои правила:

  • Методът за получаване - метод, чието име започва с "получи". Тя не взема аргументи и винаги се връща някаква стойност.
  • Сетер - метод, чието име започва с "настроен". Това отнема един параметър.

Обикновено създателите не се връщат стойност, обаче operedelenii метод за връщане параметър сетер се игнорира.

Ние разгледаме следния пример, като трасьорът определения метод или активни и отразеното в Java:

В кода по-горе, ние използвахме метод getDeclaredField. който има достъп само до областите, обявени в определен клас и не разполага с достъп до полетата на суперкласа.

Имайте предвид, че в по-горе код, ние използвахме Field.setAcessible (вярно). който деактивира достъпа проверка за указаното поле. Сега ние можем да работим с него с помощта на размисъл. дори и да е частен, защитена, или достъп. Без използването на размисъл, този метод също е частен и компилаторът няма да ни позволи да се обърнат към него.

Достъп до частните методи, използващи размисъл

Вече са известни методи за работа с методи Class.getMethod (String име, клас [] parameterTypes) и Class.getMethods () няма да помогне тук, тъй като те имат достъп до публични методи само.

Достъп до частните методи извършва чрез методи за Class.getDeclaredMethod (String име, клас [] parameterTypes) или Class.getDeclaredMethods ().

Сега нека да разгледаме един начин да се получи лично метод в Java използване на размисъл. Нека добавим метод закрит getPrivateString () в класа създадени над PrivateClass:

Java Reflection API: генеричните лекарства (Generics - основни видове)

Обикновено генеричните лекарства в Java се използват в следните ситуации:

Пример за това е интерфейс java.util.List. Вместо да създаде списък на обекти, можете да го задаване на параметри, казват от String.

По време на изпълнението на програмата, за да видите типа на параметрите му се java.util.List не е възможно, но ние можем да го намерите в полетата и методите, където тя се използва като параметрите му с помощта на Java размисъл. Ние разгледаме един пример:

Информация за генеричните лекарства в по време на работа

Информация за вида можем да получим помощта на java.lang.reflect.Method клас.

По-долу е на класа, че ние ще обработим: