Reflecție - elementele de bază

Reflecție - elementele de bază

În opinia mea, reflecția pentru Java seamănă cu energia electrică în viața unei persoane obișnuite - toți o folosesc foarte activ, dar cum funcționează cu adevărat, foarte puțini oameni știu bine și această ignoranță nu interferează deloc. Există o înțelegere generală - și suficientă.
Reflecția ca o idee și un instrument este extrem de importantă pentru înțelegerea unui număr imens de tehnologii, pachete și alte lucruri. Prin urmare, înțelegerea a ceea ce este și cunoașterea principiilor de bază este extrem de importantă.
Pe de altă parte, utilizarea API-ului Reflection (un set de funcții pentru reflecție) în viața unui programator obișnuit care se ocupă de sistemele de aplicații este rară.
Ie știți cum este, înțelegeți elementele de bază și rețineți avantajele și dezavantajele - este doar necesar. Este necesar să ne amintim setul de funcții. Este puțin probabil că le veți folosi adesea. În opinia mea, este mai bine să înțelegeți reflecția și să știți unde să mergeți pentru mai multe informații. Deși, bineînțeles, depinde mult de proiectul dvs. - poate că a ta va fi pur și simplu "înfundat" cu codul folosind API-ul Reflection. și veți realiza o înțelegere a acestei probleme, care este rar întâlnită în rândul profesioniștilor. Cine știe.

Deci ce este reflecția și ce sarcini poate rezolva?
Dacă luăm oportunități tehnice, atunci mai întâi putem distinge două grupuri de acțiuni:

  1. Puteți afla toate informațiile despre clasă - metode, câmpuri, constructori, constante, superclase, interfețe de clasă implementate de clasă.
  2. Puteți lucra cu o clasă (obiect), și anume - să creați un obiect de clasă, să executați metode, să obțineți sau să setați valori de câmp.

Dacă extindeți lista, atunci iată ce vă permite să efectuați reflecția:

  1. Aflați / Definiți o clasă de obiecte
  2. Obțineți informații despre modificatori de clasă, câmpuri, metode, constante, constructori și superclase.
  3. Aflați ce metode aparțin interfeței / interfețelor care sunt implementate.
  4. Creați o instanță a clasei și numele clasei este necunoscut până când programul se execută.
  5. Obțineți și setați valoarea câmpului de obiect după nume.
  6. Apelați metoda obiect după nume.

Și din nou într-o formă scurtă - reflecția vă permite să obțineți informații despre structura internă a clasei - domenii, metode etc. - și vă permite să accesați câmpuri, metode și alte artefacte prin intermediul acestor informații.
Și, cel mai important - se poate face totul la punerea în aplicare a programului - așa cum spun adesea, în timp de execuție.
Dacă nu ați întâlnit niciodată un astfel de mecanism, atunci este posibil să aveți o întrebare foarte rezonabilă - și de ce toate acestea sunt necesare. Răspunsul în acest caz este destul de simplu, dar în același timp foarte vag - creșteți în mod drastic FLEXIBILITATEA și capacitatea de AJUSTARE a aplicației.

Folosind reflexia, programul poate produce o metodă absolut necunoscută de clasă absolut necunoscută deja în timpul execuției. La momentul compilării, nu sa știut nimic despre această clasă și despre metodă. În aproape toate tehnologiile moderne Java, este utilizată reflexivitatea. Este greu de imaginat că Java ar putea realiza o platformă atât de vastă fără reflecție. Cel mai probabil nu a putut.

Prima cunoaștere

Să luăm în considerare o versiune necomplicată a utilizării reflecției. Cererea dvs. este programată (sau într-un alt mod) pentru a efectua o anumită metodă pentru o anumită clasă. De exemplu, trebuie să descărcați actualizări de informații financiare.
Până în prezent, această informație era în baza de date, iar metoda de clasă a reușit să obțină aceste informații din această bază de date.
Dacă proiectarea a fost făcută ținând cont de posibila înlocuire a clasei, interfața a fost definită cel mai probabil și implementarea a fost implementată ca o clasă pentru baza de date. Ceva ca această opțiune.

Structura pe care o primim din interfață poate fi o clasă

FinanceInfoBuilder builder = (FinanceInfoBuilder) cl. newInstance ();

Metoda newInstance () vă permite să creați un obiect din clasa specificată. Dar este important să notăm - un astfel de apel este posibil numai dacă clasa are un constructor FĂRĂ PARAMETRI. Dacă nu există un astfel de constructor în clasa voastră, atunci nu veți putea folosi un apel simplu - va trebui să acționați mai greu. A avea un designer fără parametri este o idee bună.
După cum probabil ați ghicit deja, apelul returnează un obiect al clasei Object și trebuie să-l aducem manual la tipul corect. pentru că ne bazam pe "onestitatea" clasei noastre, care este exprimata in sustinerea interfetei FinanceInfoBuilder, atunci ne aducem obiectul.
Acum, pentru a schimba clasa pentru a încărca indicatori financiari, trebuie doar să editați fișierul builder.properties. Nimic mai mult. Apoi a urmat o aplauză furtunoasă și prelungită.

Proiectul din NetBeans poate fi descărcat aici: FinanceExample

Clasă de clasă

Am analizat opțiunea de a încărca clasa și de a crea obiectul clasei pe care am dorit-o. De fapt, această versiune a utilizării reflecției este foarte comună. Așadar, vă recomand să vă amintiți această decizie. Acum vom vedea cum nu puteți crea doar un obiect al clasei dorite, ci și modul în care puteți accesa câmpuri sau metode.
Definim o clasă simplă pentru experimentele noastre

Proiectul în NetBeans poate fi descărcat aici: SimpleReflection

Articole similare