Ghidul complet java reflecție api

În acest articol ne vom uita la toate elementele și funcționalitatea de reflecție API-ul Java.

Reflecție în Java - este mecanismul prin care se pot face modificări și pentru a obține informații despre clase, interfețe, câmpuri și metode în timpul rulării, fără a cunoaște numele de clase, metode și câmpuri. În plus, reflecție API vă permite să creați noi cazuri de clase, apel metode și a obține sau valori de câmp stabilite.

Beginners Java-programatori adesea confundat cu introspecție reflecție. Introspecție - Cod de verificare și capacitatea de a vedea tipurile de obiecte în timpul rulării. Reflecția face posibil să se facă modificări în timpul programului prin utilizarea de introspecție. Este important să înțelegem diferența, deoarece unele limbi susțin introspecția, dar nu suport de reflecție, de exemplu, C ++.

În acest ghid ne vom uita la nu numai de bază, dar, de asemenea, mai multe caracteristici avansate de reflecție API.

Java reflecție API

Reflecția - un concept puternic, care se află în centrul de cele mai moderne cadre EE Java / Java și biblioteci. De exemplu, pentru exemplele clasice Java sunt:

  • JUnit - un cadru de unitate de testare. Acesta utilizează reflecție pentru a analiza adnotare (de exemplu, @Test) pentru a primi metodele de testare descrise în continuare programator și performanțele lor.
  • De primăvară - un cadru pentru dezvoltarea de aplicații pe platforma Java, în care se bazează pe injectarea de dependență (Inversarea de control).

Lista este nesfârșită: din container Web pentru a face față provocărilor relational mapping-obiect (ORM). Ei impartasesc un singur lucru: ei folosesc Java de reflecție, pentru că ei nu au acces și prezentarea la clasele definite de utilizator, metode, interfețe, etc.

Limitările reflectarea în Java

De ce ar trebui să nu se folosească de reflecție în programarea de obicei, atunci când există acces la interfețele și clase. Există mai multe motive:

Java reflecție: Lucrul cu clase

Java.lang.Class obiect este punctul de intrare pentru toate operațiunile de reflecție. Pentru fiecare tip de obiect, JVM creează o copie imuabilă a java.lang.Class care oferă metode pentru a prelua proprietatile unui obiect, a crea noi obiecte, invoca metode.

În această secțiune, vom discuta despre tehnici importante atunci când se lucrează cu java.lang.Class:

  • Toate tipurile în Java, inclusiv tipuri primitive și matrice au un obiect java.lang.Class asociat. Dacă știm numele clasei la momentul compilării, puteți obține obiect, după cum urmează:

Când se utilizează metoda Class.forName (), trebuie să specificați numele clasei complet calificat. Acesta este numele clasei, inclusiv orice nume de pachete. De exemplu, în cazul în care SomeObject este în pachetul com.javadevblog.app. numele complet al clasei este un șir de caractere: com.javadevblog.app.SomeObject.

Class.forName () metoda poate arunca o ClassNotFoundException excepție în cazul în care clasa nu se găsește în classpath în timpul rulării.

Obținem numele clasei

Cu ajutorul obiectului de clasă putem obține numele clasei în două moduri:

getName () metoda. care va returna numele de clasă complet calificat cu pachetul:

O clasă poate implementa mai multe interfețe. Prin urmare, se returnează o matrice de obiecte de clasă. Java Interfețele de reflecție API sunt de asemenea reprezentate de obiecte de clasă.

Notă. Metoda returnat numai interfețe care implementează clasa specificată în loc de superclasa. Pentru a obține o listă completă de interfețe puse în aplicare de către această clasă, trebuie să aplicați atât la clasa curentă, și superclasa.

Reflecție în Java: Constructori

Din moment ce puteți obține informații despre constructorul clasei folosind API-ul Java de reflecție și de a crea obiecte în timpul rulării. Acest lucru se face folosind clasa Java java.lang.reflect.Constructor.

Obținem constructorul clasei

Adică, în loc de un apel obiect objectToInvokeOn specifica nul.

Java API reflecție: Metode pentru stabilirea și obținerea valorilor

În plus față de metodele convenționale ale unei clase, putem lucra, de asemenea, cu get si set metode folosind reflecție. Obține aceste metode în mai multe moduri: de a specifica în mod explicit getter sau setter la locul de muncă sau pentru a obține în jurul valorii de toate metodele disponibile în clasă și verificați-le în cazul în care acestea sunt metode de a lua sau set:

Pentru a defini un getter sau setter, trebuie să definim unele dintre regulile:

  • Getter - o metodă a cărei nume începe cu „get“. Aceasta nu ia argumente și returnează întotdeauna o anumită valoare.
  • Setter - o metodă a cărei nume începe cu „set“. Este nevoie de un parametru.

De obicei setteri nu returnează o valoare, cu toate acestea operedelenii metoda pentru a reveni parametrul setter este ignorat.

Ne uităm la un exemplu ca setter definiții metoda sau getter prin reflexie în Java:

În codul de mai sus am folosit metoda getDeclaredField. care are acces numai la domeniile declarate într-o anumită clasă și nu are acces la câmpurile superclasei.

Rețineți că, în codul de mai sus, am folosit Field.setAcessible (adevărat). care dezactivează accesul verificarea pentru câmpul specificat. Acum putem lucra cu ea folosind reflecție. chiar dacă era privat, protejat, sau de acces implicit. Fără utilizarea de reflecție, această metodă este, de asemenea, privat și compilatorul nu ne va permite să se întoarcă la el.

Accesul la metode private care utilizează reflecție

Deja cunoscute metode de lucru cu metode Class.getMethod (String nume, clasa [] parameterTypes) și Class.getMethods () nu va ajuta aici, deoarece acestea au acces la metode publice numai.

Accesul la metodele private, efectuate folosind metode Class.getDeclaredMethod (String nume, clasa [] parameterTypes) sau Class.getDeclaredMethods ().

Acum, să ne uităm la o modalitate de a obține o metodă privată în Java folosind reflecție. Să adăugați o metodă getPrivateString de interior () în clasa a creat mai sus PrivateClass:

Java API reflecție: Generics (Generice - tipuri generice)

De obicei, generice în Java sunt utilizate în următoarele situații:

Un exemplu este interfața java.util.List. În loc de a crea o listă de obiecte, puteți parameterize, să zicem de un șir.

În timpul executării programului pentru a vedea tipul de java.util.List parametrizate nu este posibil, dar putem găsi în câmpurile și metodele, în cazul în care acesta este utilizat și parametrizat folosind reflecție Java. Ne uităm la un exemplu:

Informații despre generice în timpul rulării

Informații despre tipul putem obține folosind clasa java.lang.reflect.Method.

Mai jos este clasa pe care o vom procesa: