logo

Java Reflection API

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.
Tiedätkö?
  • 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ää ClassNotFoundExceptioninlataa 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ää SecurityExceptioninpalauttaa tämän luokan kenttien kokonaismäärän.
9) public Method[] getDeclaredMethods()heittää SecurityExceptioninpalauttaa tämän luokan menetelmien kokonaismäärän.
10) public Constructor[] getDeclaredConstructors()heittää SecurityExceptioninpalauttaa tämän luokan rakentajien kokonaismäärän.
11) julkinen menetelmä getDeclaredMethod(merkkijonon nimi,luokka[]parametrityypit)heittää NoSuchMethodException,SecurityExceptionpalauttaa 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