Develnotes - reflecție în Java - câteva exemple
Reflecție în Java - câteva exemple.
Conform Wikipedia, o reflecție - un proces în care programul poate monitoriza și modifica structura în timpul rulării. Putem spune că programul „scrie ea,“ o parte a codului în sine, chiar la momentul punerii sale în aplicare. Reflecția - o subspecie de meta-programare - crearea de programe în procesul de punere în aplicare a altor programe generează. În acest caz, o parte (sau toate) program este conceput astfel încât programul creat în timpul executării unor logică, că, în abordarea „normală“ creează un programator. Pentru ce? Este foarte simplu - uneori, o parte din date, care sunt esențiale pentru crearea algoritmului nu este disponibil în etapa de proiectare a programului. De exemplu: se știe că necesitatea de a produce anumite metode ale unui obiect, dar ceea ce - va fi clar doar în timpul rulării. Aici vine la reflecție de ajutor. Cu toate acestea, aș dori să dau câteva exemple simple de punere în aplicare de reflecție în Java. Să ne uităm la ele - vor deveni mai clare atunci când se poate folosi de reflecție într-o situație specifică.
Exemplul 1: Crearea unui obiect.
Să presupunem că doriți să creați o copie a obiectului specificat. Ce tip specific de obiect nu este clar inițial, știm doar că acesta este cel mai înalt tip în ierarhia de obiecte Java - java.lang.Object. Dacă este posibil tipuri de obiecte sunt cunoscute în prealabil, putem oferi o verificare cu ajutorul operatorului instanceof. Dar să presupunem - mai multe tipuri și asigură verificarea pentru fiecare dintre ele nu este posibil, aveți nevoie de o soluție cuprinzătoare. După crearea unei copii a unui obiect anumite acțiuni pot fi efectuate cu ea, din nou, cu ajutorul de reflecție. La urma urmei, noi nu știm ce tip de obiect a fost trecut - iar acest lucru nu este necesar. Un exemplu foarte simplu:
Exemplul 2: apelarea unei metode pe un obiect.
Să ne uităm la o metodă care vă permite să apelați la orice metodă de obiect numit dat. În cazul în care o astfel de metodă nu există, acesta va fi aruncat NoSuchMethodException. Excepție interceptării Set pentru că apelarea unei metode pe un obiect poate genera alte excepții.
După cum se poate observa, metoda va permite să apelați orice metodă dată se numește - cu sau fără argumente. Este necesar să se acorde o atenție la metoda findMethodAtClass. S-ar părea că știm tipul actual de obiect, cunosc numele metodei, ce ai nevoie?
Faptul este că, în cazul în care metoda este invocată pe un obiect folosind reflecție - este necesar să se știe care definește metoda de clasă. Să presupunem că - clasa țintă este o subclasă de superclasă, care definește metoda dorită, iar în clasa țintă este nici o astfel de metodă - trebuie să știm. Obține obiectul Metoda de subclasa nu va funcționa. Acest lucru arată o anumită metodă - ierarhie de clasă superioară, începând cu curent (de tip, care este dat obiectul).
Exemplul 3: acces la câmpurile de clasă.
Cu reflecție, puteți accesa orice nume de clasă câmp.
Puteți citi și modifica valorile câmpurilor private, chiar și câmpurile finale. Mai precis - puteți „on the fly“ pentru a face câmp similare deschis pentru citire și / sau modificări - astfel încât să puteți avea acces la teren, care a fost declarat ca fiind private, din orice clasă. Ca un exemplu - o clasă cu nume privat domeniu final. Citiți valoarea câmpului, anterior permis să-l acceseze, și apoi modificați valoarea: