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.
- 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:
Metode | Apraksts |
---|---|
1) publiskā virkne getName() | atgriež klases nosaukumu |
2) publisks statisks Class forName(String className)met ClassNotFoundException | ielādē klasi un atgriež klases klases atsauci. |
3) publiskais objekts newInstance()throws InstantiationException, IllegalAccessException | izveido 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 SecurityException | atgriež kopējo šīs klases lauku skaitu. |
9) publiskā Method[] getDeclaredMethods()throws SecurityException | atgriež kopējo šīs klases metožu skaitu. |
10) publiskais konstruktors[] getDeclaredConstructors()izmet SecurityException | atgriež kopējo šīs klases konstruktoru skaitu. |
11) publiskā metode getDeclaredMethod(virknes nosaukums,Class[]parametrsTypes)met NoSuchMethodException,SecurityException | atgriež 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() metodeIzpratne par javap rīku
javap rīka izveide
sīklietotņu skatītāja rīka izveide
Izsaukt privāto metodi no citas klases