Annotaatioiden käsittely ajon aikana
Lue annotaatioita ajon aikana Reflectionin avulla validointi-, reititys- tai injektiologiikan toteuttamiseksi.
Annotaatioiden käsittely ajon aikana on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.
Luokkatasoisten annotaatioiden lukeminen
Hakekaa luokan annotaatiot käyttämällä Class.getAnnotation()-metodia (yksi annotaatio) tai getAnnotations()-metodia (kaikki annotaatiot). Metodi palauttaa null-arvon, jos annotaatiota ei ole.
@Service
@RequestMapping("/api")
public class UserController {}
RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println(Arrays.toString(rm.value())); // ["/api"]Metodien annotaatioiden lukeminen
Hakekaa metodien annotaatiot method.getAnnotation()-metodilla. Käykää getDeclaredMethods()-metodin avulla läpi kaikki luokan metodit.
for (Method m : UserController.class.getDeclaredMethods()) {
GetMapping gm = m.getAnnotation(GetMapping.class);
if (gm != null) System.out.println(m.getName() + " -> " + Arrays.toString(gm.value()));
}Kenttien annotaatioiden lukeminen
Kenttien annotaatioita käyttävät validointi- ja ORM-kehykset. Käykää getDeclaredFields()-metodin avulla kentät läpi ja tarkistakaa jokaisen kannalta olennaisen annotaation olemassaolo.
for (Field f : User.class.getDeclaredFields()) {
Column col = f.getAnnotation(Column.class);
if (col != null) System.out.println(f.getName() + " -> column: " + col.name());
}Parametrien annotaatioiden lukeminen
Parametrien annotaatiot ovat saatavilla method.getParameterAnnotations()-metodilla. Se palauttaa kaksiulotteisen taulukon: yksi rivi parametria kohden ja yksi alkio annotaatiota kohden.
Method m = UserController.class.getDeclaredMethod("create", UserDto.class);
Annotation[][] pa = m.getParameterAnnotations();
for (Annotation a : pa[0]) System.out.println(a.annotationType().getSimpleName()); // e.g. ValidisAnnotationPresent
Käyttäkää isAnnotationPresent(AnnotationType.class)-metodia nopeana null-turvallisena tarkistuksena ennen annotaation arvon lukemista.
if (m.isAnnotationPresent(Transactional.class)) {
beginTransaction();
m.invoke(target, args);
commitTransaction();
}Yksinkertaisen riippuvuuksien injektiokontin rakentaminen
Skannatkaa paketti @Component-annotaatiolla merkittyjen luokkien löytämiseksi, luokaa niistä instanssit reflektion avulla ja tallentakaa ne karttaan. Näin rakennetaan yksinkertaistettu Spring-kontti.
Map<Class<?>, Object> beans = new HashMap<>();
for (Class<?> cls : scanPackage("com.example")) {
if (cls.isAnnotationPresent(Component.class)) {
beans.put(cls, cls.getDeclaredConstructor().newInstance());
}
}@Inject-annotaatiolla merkittyjen kenttien injektointi
Kun bean-oliot on luotu, etsikää @Inject-annotaatiolla merkityt kentät ja asettakaa niiden arvot reflektion avulla. Näin jäljitellään kenttäinjektiota.
for (Object bean : beans.values()) {
for (Field f : bean.getClass().getDeclaredFields()) {
if (f.isAnnotationPresent(Inject.class)) {
f.setAccessible(true);
f.set(bean, beans.get(f.getType()));
}
}
}Ajonaikainen validointi annotaatioarvojen avulla
Lukekaa rajoiteannotaatioiden arvot, kuten @Range(min=1, max=100), ja validoikaa kentän arvo niiden perusteella suorituksen aikana.
for (Field f : dto.getClass().getDeclaredFields()) {
Range range = f.getAnnotation(Range.class);
if (range != null) {
f.setAccessible(true);
int val = (int) f.get(dto);
if (val < range.min() || val > range.max())
throw new ValidationException(f.getName() + " out of range");
}
}Toistettavien annotaatioiden lukeminen
Käyttäkää @Repeatable-annotaatioiden yhteydessä getAnnotationsByType()-metodia kaikkien esiintymien hakemiseen säilöannotaatiosta läpinäkyvästi.
Tag[] tags = MyClass.class.getAnnotationsByType(Tag.class);
for (Tag t : tags) System.out.println(t.value());Pakettien skannaaminen ClassPath-kirjastojen avulla
Javan vakioreflektio ei pysty luettelemaan kaikkia paketin luokkia. Käyttäkää classpath-merkintöjen skannaamiseen esimerkiksi Reflections-, ClassGraph- tai Spring-kirjastoa ja sen ClassPathScanningCandidateComponentProvider-luokkaa.
Reflections reflections = new Reflections("com.example.service");
Set<Class<?>> services = reflections.getTypesAnnotatedWith(Service.class);
services.forEach(System.out::println);Annotaatioiden käsittely suorituksen aikana: yhteenveto
Annotaatioiden ajonaikainen käsittely mahdollistaa riippuvuuksien injektion, validoinnin, reitityksen ja ORM:n. Se on alustuksen yhteydessä tehtävää työtä: käsitelkää annotaatiot kerran käynnistyksen aikana, tallentakaa tulokset välimuistiin ja välttäkää reflektiota jokaisen pyynnön käsittelypoluilla.
Pikatarkistus
Millä metodilla haetaan kaikki @Repeatable-annotaation esiintymät?
Kertaus
Käyttäkää getAnnotation- ja isAnnotationPresent-metodeja yksittäisten annotaatioiden käsittelyyn. Skannatkaa metodit ja kentät getDeclared*-metodien avulla. Käyttäkää getAnnotationsByType-metodia toistettaville annotaatioille. Käsitelkää annotaatiot käynnistyksen aikana ja tallentakaa tulokset välimuistiin.
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 ”Annotaatioiden käsittely ajon aikana” ilmainen?
Kyllä – oppitunnin ”Annotaatioiden käsittely ajon aikana” 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 ”Annotaatioiden käsittely ajon aikana”?
Lue annotaatioita ajon aikana Reflectionin avulla validointi-, reititys- tai injektiologiikan toteuttamiseksi. 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 3/4.
Kuinka kauan ”Annotaatioiden käsittely ajon aikana”-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
- Annotaatioiden määrittäminen: elementit ja oletusarvot
- Säilytyskäytännöt ja kohdetyypit
- Annotaatioiden käsittely ajon aikana
- Käännösaikaiset annotaatioprosessorit