Luokkien tarkastelu Reflectionilla
Hae Class-oliot ja tarkastele ajon aikana kenttiä, metodeja, konstruktoreita ja annotaatioita.
Luokkien tarkastelu Reflectionilla on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä reflektio on
Reflektion avulla Java-ohjelma voi tutkia ja käsitellä omaa rakennettaan ajonaikana — lukea luokkien nimiä, kenttiä, metodeja, konstruktoreita ja annotaatioita ilman, että niitä tarvitsee tuntea käännösaikana.
Class-olion hankkiminen
Hankkikaa Class<?>-olio literaalin, getClass()-metodin tai Class.forName()-metodin avulla.
Class<String> c1 = String.class; // literal
Class<?> c2 = "hello".getClass(); // from instance
Class<?> c3 = Class.forName("java.util.ArrayList"); // by nameLuokan metatietojen tutkiminen
Hakekaa luokan nimi, pakkaus, yliluokka ja toteutetut rajapinnat Class-oliosta.
Class<?> c = ArrayList.class;
System.out.println(c.getName()); // java.util.ArrayList
System.out.println(c.getSimpleName()); // ArrayList
System.out.println(c.getSuperclass()); // class java.util.AbstractList
for (Class<?> iface : c.getInterfaces()) System.out.println(iface.getName());Määriteltyjen kenttien luetteloiminen
getDeclaredFields() palauttaa kaikki luokassa määritellyt kentät, myös yksityiset. getFields() palauttaa vain julkiset kentät, myös perityt.
for (Field f : User.class.getDeclaredFields()) {
System.out.printf("%-10s %s%n", f.getType().getSimpleName(), f.getName());
}Metodien luetteloiminen
getDeclaredMethods() luettelee kaikki metodit käyttöoikeudesta riippumatta. Käyttäkää getMethods()-metodia julkisten metodien, myös perittyjen, hakemiseen.
for (Method m : String.class.getDeclaredMethods()) {
System.out.println(m.getName() + " -> " + m.getReturnType().getSimpleName());
}Metodiparametrien tutkiminen
Hakekaa parametrien tyypit, nimet (edellyttää -parameters-kääntäjävalitsinta) ja annotaatiot.
Method m = UserService.class.getDeclaredMethod("findById", Long.class);
for (Parameter p : m.getParameters()) {
System.out.println(p.getType().getSimpleName() + " " + p.getName());
}Konstruktoreiden luetteloiminen
Tutkikaa konstruktoreita samalla tavalla kuin metodeja. getDeclaredConstructors() sisältää myös yksityiset konstruktorit, joita käytetään singleton-toteutuksissa tai builder-rakenteissa.
for (Constructor<?> c : User.class.getDeclaredConstructors()) {
System.out.println(Arrays.toString(c.getParameterTypes()));
}Annotaatioiden lukeminen
Hakekaa luokan, metodin tai kentän annotaatiot. Tarkistakaa annotaation olemassaolo isAnnotationPresent-metodilla ja hakekaa sen arvo getAnnotation-metodilla.
@RestController
@RequestMapping("/users")
public class UserController {}
// Inspection:
RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println("Path: " + Arrays.toString(rm.value()));Määritteiden tarkistaminen
Käyttäkää kentän, metodin tai luokan määritteisiin metodeja Modifier.isPublic(), isStatic(), isFinal() ja niin edelleen suodattaaksenne kohteita näkyvyyden perusteella.
for (Field f : User.class.getDeclaredFields()) {
int mod = f.getModifiers();
if (Modifier.isPrivate(mod)) System.out.println("private: " + f.getName());
}isAssignableFrom- ja instanceof-tarkistus
Käyttäkää Class.isAssignableFrom()-metodia tyyppien yhteensopivuuden tarkistamiseen ohjelmallisesti — se vastaa instanceof-operaattoria, mutta toimii vain ajonaikana tunnettujen Class-olioiden kanssa.
Class<?> parent = Collection.class;
Class<?> child = ArrayList.class;
System.out.println(parent.isAssignableFrom(child)); // true
System.out.println(child.isAssignableFrom(parent)); // falseSuorituskykyä koskeva huomautus
Reflektio on yksinkertaisten kenttä- ja metodikutsujen yhteydessä 10–50 kertaa hitaampaa kuin suora koodi. Välittäkää Field- ja Method-oliot ja kutsukaa setAccessible(true)-metodia kerran, minkä jälkeen käyttäkää olioita uudelleen.
private static final Field NAME_FIELD;
static {
try { NAME_FIELD = User.class.getDeclaredField("name"); NAME_FIELD.setAccessible(true); }
catch (NoSuchFieldException e) { throw new RuntimeException(e); }
}Pikatarkistus
Mikä metodi palauttaa luokan yksityiset kentät, mutta ei perittyjä kenttiä?
Kertaus
Hankkikaa Class-olio literaalien tai forName()-metodin avulla. Käyttäkää getDeclaredFields/Methods/Constructors-metodeja kaikkien käyttöoikeustasojen kohteiden tutkimiseen. Lukekaa annotaatiot getAnnotation-metodilla. Välittäkää reflektio-oliot suorituskyvyn parantamiseksi.
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”Luokkien tarkastelu Reflectionilla” ilmainen?
Kyllä – oppitunnin ”Luokkien tarkastelu Reflectionilla” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Luokkien tarkastelu Reflectionilla”?
Hae Class-oliot ja tarkastele ajon aikana kenttiä, metodeja, konstruktoreita ja annotaatioita. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Luokkien tarkastelu Reflectionilla”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Luokkien tarkastelu Reflectionilla
- Metodien kutsuminen ja kenttien käyttäminen
- Dynaamiset proxyt InvocationHandlerilla
- Reflectionin suorituskyky ja vaihtoehdot