logo

„Java Reflection“ API

Java atspindys yra procesas, kurio metu tiriamas arba keičiamas klasės veikimo laikas vykdymo metu .

The java.lang.Class klasė suteikia daug metodų, kuriuos galima naudoti norint gauti metaduomenis, ištirti ir pakeisti klasės veikimo laiką.

Paketai java.lang ir java.lang.reflect pateikia java atspindžio klases.

kaip ištrinti stulpelį postgresql

Kur jis naudojamas

Reflection API daugiausia naudojama:

  • IDE (integruota kūrimo aplinka), pvz., „Eclipse“, „MyEclipse“, „NetBeans“ ir kt.
  • Derintuvas
  • Bandymo įrankiai ir kt.
Ar tu žinai?
  • Kiek būdų galime gauti klasės klasės egzempliorių?
  • Kaip sukurti javap įrankį?
  • Kaip sukurti programėlių peržiūros įrankį?
  • Kaip pasiekti privatų metodą iš klasės ribų?

java.lang.Klasės klasė

Klasė java.lang.Class daugiausia atlieka dvi užduotis:

  • pateikia metodus, kaip gauti klasės metaduomenis vykdymo metu.
  • pateikia metodus, kaip ištirti ir pakeisti klasės veikimo laiką.

Dažniausiai naudojami klasės klasės metodai:

Metodasapibūdinimas
1) vieša eilutė getName()grąžina klasės pavadinimą
2) vieša statinė Class forName(String className) meta ClassNotFoundExceptionįkelia klasę ir grąžina klasės klasės nuorodą.
3) viešasis objektas newInstance() meta InstantiationException, IllegalAccessExceptionsukuria naują egzempliorių.
4) viešoji loginė isInterface()patikrina, ar tai sąsaja.
5) viešasis loginis isArray ();patikrina, ar tai masyvas.
6) viešoji loginė reikšmė yra Primitive()patikrina, ar jis primityvus.
7) viešoji klasė getSuperclass()grąžina superklasės klasės nuorodą.
8) viešasis laukas[] getDeclaredFields() išmeta SecurityExceptiongrąžina bendrą šios klasės laukų skaičių.
9) viešasis metodas[] getDeclaredMethods() išmeta SecurityExceptiongrąžina bendrą šios klasės metodų skaičių.
10) public Constructor[] getDeclaredConstructors()meta SecurityExceptiongrąžina bendrą šios klasės konstruktorių skaičių.
11) viešasis metodas getDeclaredMethod(Eilutės pavadinimas,Class[]parametrasTypai)meta NoSuchMethodException,SecurityExceptiongrąžina metodo klasės egzempliorių.

Kaip gauti klasės klasės objektą?

Yra 3 būdai, kaip gauti klasės klasės egzempliorių. Jie yra tokie:

  • ForName() klasės klasės metodas
  • Objektų klasės metodas getClass().
  • .klasės sintaksė

1) ForName() klasės klasės metodas

  • naudojamas dinamiškai įkelti klasę.
  • grąžina klasės klasės egzempliorių.
  • Jis turėtų būti naudojamas, jei žinote visiškai apibrėžtą klasės pavadinimą. Jis negali būti naudojamas primityviems tipams.

Pažiūrėkime paprastą forName() metodo pavyzdį.

Failo pavadinimas: Test.java

 class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } } 

Išvestis:

 Simple 

2) Objektų klasės metodas getClass().

Jis grąžina klasės klasės egzempliorių. Jis turėtų būti naudojamas, jei žinote tipą. Be to, jis gali būti naudojamas su primityvais.

xor c++

Failo pavadinimas: Test.java

 class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } } 

Išvestis:

Simple 

3) .class sintaksė

Jei tipas yra, bet egzemplioriaus nėra, klasę galima gauti pridedant „.class“ prie tipo pavadinimo. Jis taip pat gali būti naudojamas primityviems duomenų tipams.

Failo pavadinimas: Test.java

 class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } } 

Išvestis:

 boolean Test 

Klasės objekto nustatymas

Klasės objektui nustatyti naudojami šie klasės klasės metodai:

1) viešoji loginė isInterface(): nustato, ar nurodytas klasės objektas yra sąsajos tipas.

koks mano kompiuterio ekrano dydis

2) viešasis loginis isArray(): nustato, ar šis Class objektas yra masyvo klasė.

3) viešoji loginė reikšmė yra Primitive(): nustato, ar nurodytas klasės objektas yra primityvus tipas.

Pažiūrėkime paprastą atspindžio API pavyzdį, kad nustatytų objekto tipą.

Failo pavadinimas: Test.java

 class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } } 

Išvestis:

 false true 

Refleksijos privalumai ir trūkumai

Java atspindys visada turėtų būti naudojamas atsargiai. Nors atspindys suteikia daug privalumų, jis turi ir trūkumų. Pirmiausia aptarkime privalumus.

Privalumai: Sąsajų, klasių, metodų ir laukų tikrinimas vykdymo metu galimas naudojant atspindį, net ir nenaudojant jų pavadinimų kompiliavimo metu. Taip pat galima iškviesti metodus, išaiškinti momentus arba nustatyti laukų reikšmę naudojant atspindį. Tai padeda kurti vizualinės kūrimo aplinkas ir klasės naršykles, kurios padeda kūrėjams parašyti teisingą kodą.

java poeilutės metodas

Minusai: Naudojant refleksiją, galima sulaužyti inkapsuliavimo principus. Naudojant refleksiją galima pasiekti privačius klasės metodus ir laukus. Taigi atspindys gali nutekėti svarbius duomenis į išorinį pasaulį, o tai yra pavojinga. Pavyzdžiui, jei vienas pasiekia privačius klasės narius ir nustato jai nulinę reikšmę, kitas tos pačios klasės vartotojas gali gauti NullReferenceException, ir tokio elgesio nesitikima.

Kitas trūkumas yra pridėtinės veiklos sąnaudos. Kadangi atspindimi tipai išsprendžiami dinamiškai, JVM (Java virtualios mašinos) optimizavimas negali vykti. Todėl atspindžių atliekamos operacijos dažniausiai būna lėtos.

Išvada

Dėl minėtų trūkumų apskritai patartina vengti refleksijos. Tai pažangi funkcija, kurią turėtų naudoti tik programuotojai ar kūrėjai, gerai išmanantys kalbos pagrindus. Visada prisimink! Kai naudojamas atspindys, kyla pavojus programos saugumui.


Kitas Apmąstymų API mokymo programa

newInstance() metodas
„Javap“ įrankio supratimas
sukurti javap įrankį
programėlių peržiūros įrankio kūrimas
Iškvieskite privatų metodą iš kitos klasės