logo

Java Reflection API

Java refleksija ir klases darbības laika pārbaudes vai modificēšanas process izpildes laikā .

The java.lang.Class klase nodrošina daudzas metodes, ko var izmantot, lai iegūtu metadatus, pārbaudītu un mainītu klases darbības laiku.

Java.lang un java.lang.reflect pakotnes nodrošina java atspoguļošanas klases.

Kur tas tiek izmantots

Reflection API galvenokārt izmanto:

  • IDE (integrētā izstrādes vide), piemēram, Eclipse, MyEclipse, NetBeans utt.
  • Atkļūdotājs
  • Pārbaudes rīki utt.
Vai Tu zini?
  • Cik daudzos veidos mēs varam iegūt klases klases gadījumu?
  • Kā izveidot javap rīku?
  • Kā izveidot sīklietotņu apskates rīku?
  • Kā piekļūt privātajai metodei ārpus klases?

java.lang.Klases klase

Klase java.lang.Class galvenokārt veic divus uzdevumus:

java mantojums
  • nodrošina metodes, lai iegūtu klases metadatus izpildes laikā.
  • nodrošina metodes, lai pārbaudītu un mainītu klases darbības laiku.

Klases klases parasti izmantotās metodes:

MetodeApraksts
1) publiskā virkne getName()atgriež klases nosaukumu
2) publisks statisks Class forName(String className)met ClassNotFoundExceptionielādē klasi un atgriež klases klases atsauci.
3) publiskais objekts newInstance()throws InstantiationException, IllegalAccessExceptionizveido jaunu instanci.
4) publiskais Būla isInterface()pārbauda, ​​vai tas ir interfeiss.
5) publiskais Būla isArray ();pārbauda, ​​vai tas ir masīvs.
6) publiskais Būla irPrimitive()pārbauda, ​​vai tas ir primitīvs.
7) publiskā klase getSuperclass()atgriež virsklases klases atsauci.
8) publiskais lauks[] getDeclaredFields() met SecurityExceptionatgriež kopējo šīs klases lauku skaitu.
9) publiskā Method[] getDeclaredMethods()throws SecurityExceptionatgriež kopējo šīs klases metožu skaitu.
10) publiskais konstruktors[] getDeclaredConstructors()izmet SecurityExceptionatgriež kopējo šīs klases konstruktoru skaitu.
11) publiskā metode getDeclaredMethod(virknes nosaukums,Class[]parametrsTypes)met NoSuchMethodException,SecurityExceptionatgriež metodes klases gadījumu.

Kā iegūt klases klases objektu?

Ir 3 veidi, kā iegūt klases klases gadījumu. Tie ir šādi:

  • ForName() klases klases metode
  • Objektu klases metode getClass().
  • .klases sintakse

1) klases klases metode forName().

  • tiek izmantots, lai dinamiski ielādētu klasi.
  • atgriež klases klases gadījumu.
  • To vajadzētu izmantot, ja zināt klases pilnībā kvalificēto nosaukumu. To nevar izmantot primitīviem tipiem.

Apskatīsim vienkāršu metodes forName() piemēru.

Faila nosaukums: Test.java

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

Izvade:

 Simple 

2) Objektu klases metode getClass().

Tas atgriež klases klases gadījumu. To vajadzētu izmantot, ja zināt veidu. Turklāt to var izmantot ar primitīviem.

Faila nosaukums: 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); } } 

Izvade:

Simple 

3) .class sintakse

Ja tips ir pieejams, bet instances nav, tad ir iespējams iegūt Klasi, tipa nosaukumam pievienojot '.class'. To var izmantot arī primitīviem datu tipiem.

Faila nosaukums: Test.java

osi atsauces modelis tīklu veidošanā
 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()); } } 

Izvade:

 boolean Test 

Klases objekta noteikšana

Klases objekta noteikšanai tiek izmantotas šādas klases klases metodes:

1) publiskais Būla isInterface(): nosaka, vai norādītais klases objekts pārstāv saskarnes tipu.

2) publiskais Būla isArray(): nosaka, vai šis klases objekts pārstāv masīva klasi.

3) publiskais Būla irPrimitive(): nosaka, vai norādītais klases objekts pārstāv primitīvu tipu.

Apskatīsim vienkāršu refleksijas API piemēru objekta veida noteikšanai.

java virknes formāts

Faila nosaukums: 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);} } } 

Izvade:

fontu gimp
 false true 

Pārdomu plusi un mīnusi

Java atspoguļojums vienmēr jāizmanto piesardzīgi. Lai gan atspoguļojums sniedz daudz priekšrocību, tai ir arī daži trūkumi. Vispirms apspriedīsim priekšrocības.

Plusi: Interfeisu, klašu, metožu un lauku pārbaude izpildlaikā ir iespējama, izmantojot refleksiju, pat neizmantojot to nosaukumus kompilēšanas laikā. Ir iespējams arī izsaukt metodes, izveidot skaidru momentu vai iestatīt lauku vērtību, izmantojot refleksiju. Tas palīdz izveidot vizuālās izstrādes vides un klases pārlūkprogrammas, kas izstrādātājiem palīdz rakstīt pareizo kodu.

Mīnusi: Izmantojot refleksiju, var lauzt iekapsulēšanas principus. Izmantojot refleksiju, ir iespējams piekļūt klases privātajām metodēm un laukiem. Tādējādi pārdomas var nopludināt svarīgus datus ārpasaulei, kas ir bīstami. Piemēram, ja viens piekļūst klases privātajiem dalībniekiem un iestata tai nulles vērtību, tad otrs tās pašas klases lietotājs var iegūt NullReferenceException, un šāda rīcība nav sagaidāma.

Vēl viens trūkums ir veiktspējas pieskaitāmās izmaksas. Tā kā atspoguļotie veidi tiek atrisināti dinamiski, JVM (Java Virtual Machine) optimizācija nevar notikt. Tāpēc atspulgu veiktās darbības parasti ir lēnas.

Secinājums

Iepriekš minēto mīnusu dēļ parasti ir ieteicams izvairīties no refleksijas izmantošanas. Tā ir uzlabota funkcija, kuru drīkst izmantot tikai programmētāji vai izstrādātāji, kuri labi pārzina valodas pamatus. Vienmēr atceries! Ikreiz, kad tiek izmantota refleksija, tiek apdraudēta lietojumprogrammas drošība.


Nākamā tēmas Reflection API apmācība

newInstance() metode
Izpratne par javap rīku
javap rīka izveide
sīklietotņu skatītāja rīka izveide
Izsaukt privāto metodi no citas klases