Java heijastus on prosessi, jossa tutkitaan tai muutetaan luokan ajonaikaista käyttäytymistä ajon aikana .
The java.lang.Class luokka tarjoaa monia menetelmiä, joiden avulla voidaan saada metatietoja, tutkia ja muuttaa luokan ajonaikaista käyttäytymistä.
Paketit java.lang ja java.lang.reflect tarjoavat luokat java-heijastukselle.
Missä sitä käytetään
Reflection API:ta käytetään pääasiassa:
- IDE (Integrated Development Environment), esim. Eclipse, MyEclipse, NetBeans jne.
- Virheen korjaaja
- Testityökalut jne.
- Kuinka monella tavalla voimme saada Class-luokan esiintymän?
- Kuinka luoda javap-työkalu?
- Kuinka luodaan appletviewer-työkalu?
- Kuinka päästä yksityiseen menetelmään luokan ulkopuolelta?
java.lang.Class class
Java.lang.Class-luokka suorittaa pääasiassa kaksi tehtävää:
silmukalle javassa
- tarjoaa menetelmiä luokan metatietojen saamiseksi ajon aikana.
- tarjoaa menetelmiä tutkia ja muuttaa luokan ajonaikaista käyttäytymistä.
Yleisesti käytetyt Class-luokan menetelmät:
Menetelmä | Kuvaus |
---|---|
1) julkinen merkkijono getName() | palauttaa luokan nimen |
2) julkinen staattinen Class forName(String className) heittää ClassNotFoundExceptionin | lataa luokan ja palauttaa luokan luokan viitteen. |
3) julkinen objekti newInstance()heittää InstantiationException-, IllegalAccessException- | luo uuden ilmentymän. |
4) public boolean isInterface() | tarkistaa, onko se käyttöliittymä. |
5) public boolean isArray (); | tarkistaa, onko se array. |
6) julkinen boolean isPrimitive() | tarkistaa, onko se primitiivinen. |
7) julkinen luokka getSuperclass() | palauttaa superluokan luokkaviitteen. |
8) public Field[] getDeclaredFields()heittää SecurityExceptionin | palauttaa tämän luokan kenttien kokonaismäärän. |
9) public Method[] getDeclaredMethods()heittää SecurityExceptionin | palauttaa tämän luokan menetelmien kokonaismäärän. |
10) public Constructor[] getDeclaredConstructors()heittää SecurityExceptionin | palauttaa tämän luokan rakentajien kokonaismäärän. |
11) julkinen menetelmä getDeclaredMethod(merkkijonon nimi,luokka[]parametrityypit)heittää NoSuchMethodException,SecurityException | palauttaa menetelmäluokan ilmentymän. |
Kuinka saada Class-luokan objekti?
Class-luokan esiintymän hankkimiseen on kolme tapaa. Ne ovat seuraavat:
- ForName()-metodi Class-luokassa
- GetClass() Object-luokan menetelmä
- .class syntaksi
1) luokan luokan forName()-metodi
- käytetään luokan lataamiseen dynaamisesti.
- palauttaa Class-luokan esiintymän.
- Sitä tulee käyttää, jos tiedät luokan täydellisen nimen. Tätä ei voi käyttää primitiivisille tyypeille.
Katsotaanpa yksinkertainen esimerkki menetelmästä forName().
Tiedoston nimi: Test.java
fibonacci-sarja vuonna v
class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } }
Lähtö:
Simple
2) Object-luokan getClass()-metodi
Se palauttaa Class-luokan esiintymän. Sitä kannattaa käyttää, jos tiedät tyypin. Lisäksi sitä voidaan käyttää primitiivien kanssa.
Tiedoston nimi: 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); } }
Lähtö:
Simple
3) .class syntaksi
Jos tyyppi on saatavilla, mutta esiintymää ei ole, on mahdollista saada luokka lisäämällä tyypin nimeen '.class'. Sitä voidaan käyttää myös primitiivisissä tietotyypeissä.
Tiedoston nimi: Test.java
taskulampun asennus
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()); } }
Lähtö:
boolean Test
Luokkaobjektin määrittäminen
Seuraavia Class-luokan menetelmiä käytetään luokkaobjektin määrittämiseen:
1) julkinen boolean isInterface(): määrittää, edustaako määritetty luokkaobjekti liitäntätyyppiä.
2) julkinen boolean isArray(): määrittää, edustaako tämä Class-objekti taulukkoluokkaa.
verilog-tapauslausunto
3) julkinen boolean isPrimitive(): määrittää, edustaako määritetty luokkaobjekti primitiivistä tyyppiä.
Katsotaanpa yksinkertainen esimerkki heijastussovellusliittymästä objektityypin määrittämiseksi.
Tiedoston nimi: 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);} } }
Lähtö:
deterministiset äärelliset automaatit
false true
Heijastuksen plussat ja miinukset
Java-heijastusta tulee aina käyttää varoen. Vaikka heijastuksella on paljon etuja, sillä on myös joitain haittoja. Keskustellaan ensin eduista.
Plussat: Liitäntöjen, luokkien, menetelmien ja kenttien tarkastaminen ajon aikana on mahdollista heijastuksen avulla, jopa ilman niiden nimiä käännösaikana. On myös mahdollista kutsua menetelmiä, instantoida clear tai asettaa kenttien arvoja heijastuksen avulla. Se auttaa luomaan visuaalisia kehitysympäristöjä ja luokkaselaimia, jotka auttavat kehittäjiä kirjoittamaan oikean koodin.
Haittoja: Heijastuksen avulla voidaan rikkoa kapseloinnin periaatteita. Luokan yksityisiin menetelmiin ja kenttiin on mahdollista päästä käsiksi heijastuksen avulla. Siten heijastus voi vuotaa tärkeitä tietoja ulkomaailmaan, mikä on vaarallista. Jos esimerkiksi yksi käyttää luokan yksityisiä jäseniä ja asettaa sille nolla-arvon, saman luokan toinen käyttäjä voi saada NullReferenceExceptionin, eikä tätä toimintaa ole odotettavissa.
Toinen huono puoli on suorituskyvyn yleiskustannukset. Koska heijastustyypit ratkaistaan dynaamisesti, JVM (Java Virtual Machine) -optimointia ei voi tapahtua. Siksi heijastusten suorittamat toiminnot ovat yleensä hitaita.
Johtopäätös
Edellä mainittujen haittojen vuoksi on yleensä suositeltavaa välttää heijastuksen käyttöä. Se on edistynyt ominaisuus, jota vain ohjelmoijat tai kehittäjät, joilla on hyvät tiedot kielen perusteista, voivat käyttää. Muista aina! Aina kun heijastusta käytetään, sovelluksen turvallisuus vaarantuu.
Seuraava Topics of Reflection API -opastus
newInstance() -menetelmäJavap-työkalun ymmärtäminen
javap-työkalun luominen
luomalla appletviewer-työkalun
Kutsu yksityinen menetelmä toisesta luokasta