En guide til refleksionsbiblioteket
1. Introduktion
Det Refleksioner biblioteket fungerer som en klassescanner. Det indekserer de scannede metadata og giver os mulighed for at spørge dem ved kørsel. Det kan også gemme disse oplysninger, så vi kan indsamle og bruge dem på ethvert tidspunkt under vores projekt uden at skulle scanne klassestien igen.
I denne vejledning viser vi, hvordan du konfigurerer Refleksioner bibliotek og brug det i vores Java-projekter.
2. Maven-afhængighed
At bruge Refleksioner, skal vi medtage dens afhængighed i vores projekt:
org.refleksioner refleksioner 0.9.11
Vi kan finde den nyeste version af biblioteket på Maven Central.
3. Konfiguration Refleksioner
Dernæst skal vi konfigurere biblioteket. Hovedelementerne i konfigurationen er URL'erne og scannerne.
URL'erne fortæller biblioteket, hvilke dele af klassestien der skal scannes, mens scannerne er de objekter, der scanner de givne URL'er.
Hvis der ikke er konfigureret nogen scanner, bruger biblioteket Type AnnotationsScanner og SubTypesScanner som standardindstillingerne.
3.1. Tilføjelse af webadresser
Vi kan konfigurere Refleksioner enten ved at angive konfigurationselementerne som varargs-konstruktørens parametre eller ved at bruge ConfigurationBuilder objekt.
For eksempel kan vi tilføje webadresser ved at instantiere Refleksioner ved hjælp af en Snor repræsenterer pakkenavnet, klassen eller klasselæsseren:
Refleksioner refleksioner = nye refleksioner ("com.baeldung.reflections"); Refleksioner refleksioner = nye refleksioner (MyClass.class); Refleksioner refleksioner = nye refleksioner (MyClass.class.getClassLoader ());
Desuden fordi Refleksioner har en varargs konstruktør, vi kan kombinere alle ovennævnte konfigurationstyper for at instantiere den:
Refleksioner refleksioner = nye refleksioner ("com.baeldung.reflections", MyClass.class);
Her tilføjer vi webadresser ved at specificere pakken og klassen, der skal scannes.
Vi kan opnå de samme resultater ved at bruge ConfigurationBuilder:
Refleksionsrefleksioner = nye refleksioner (ny ConfigurationBuilder () .setUrls (ClasspathHelper.forPackage ("com.baeldung.reflections"))));
Sammen med forPakke () metode, ClasspathHelper giver andre metoder, såsom forClass () og forClassLoader (), for at tilføje URL'er til konfigurationen.
3.2. Tilføjelse af scannere
Reflections-biblioteket leveres med mange indbyggede scannere:
- FieldAnnotationsScanner - ser efter feltets kommentarer
- MetodeParameterScanner - scanner metoder / konstruktører, indekserer derefter parametre og returnerer type- og parameterkommentarer
- MetodeParameterNamesScanner - inspicerer metoder / konstruktører og indekserer derefter parameternavne
- TypeElementsScanner - undersøger felter og metoder og gemmer derefter det fuldt kvalificerede navn som en nøgle og elementer som værdier
- MemberUsageScanner - scanner metoder / konstruktører / felter
- Type AnnotationsScanner - ser efter klassens runtime-kommentarer
- Undertypescanner - søger efter super klasser og grænseflader til en klasse, hvilket giver mulighed for en omvendt opslag efter undertyper
- MetodeBemærkningerScanner - scanner efter metodens annoteringer
- ResourcesScanner - samler alle ressourcer, der ikke er klasses i en samling
Vi kan tilføje scannere til konfigurationen som parametre for Refleksioner'Konstruktør.
Lad os f.eks. Tilføje de to første scannere fra ovenstående liste:
Refleksioner refleksioner = nye refleksioner ("com.baeldung.reflections"), nye FieldAnnotationsScanner (), nye MethodParameterScanner ());
Igen kan de to scannere konfigureres ved hjælp af ConfigurationBuilder hjælperklasse:
Refleksionsrefleksioner = nye refleksioner (ny ConfigurationBuilder () .setUrls (ClasspathHelper.forPackage ("com.baeldung.reflections")) .setScanners (ny FieldAnnotationsScanner (), ny MethodParameterScanner ()));
3.3. Tilføjelse af ExecutorService
Ud over URL'er og scannere, Refleksioner giver os muligheden for at asynkront scanne klassestien ved hjælp af ExecutorService.
Vi kan tilføje det som en parameter for Refleksioner'Konstruktør eller gennem ConfigurationBuilder:
Refleksionsrefleksioner = nye refleksioner (ny ConfigurationBuilder () .setUrls (ClasspathHelper.forPackage ("com.baeldung.reflections")) .setScannere (ny SubTypesScanner (), ny TypeAnnotationsScanner ()) .setExecutorService (Executors.newFixedTread) ;
En anden mulighed er blot at ringe til useParallelExecutor () metode. Denne metode konfigurerer en standard FixedThreadPoolExecutorService med en størrelse svarende til antallet af tilgængelige kerneprocessorer.
3.4. Tilføjelse af filtre
Et andet vigtigt konfigurationselement er et filter. Et filter fortæller scannerne, hvad de skal medtage, og hvad de skal ekskludere, når de scanner klassestien.
Som en illustration kan vi konfigurere filteret til at udelukke scanning af testpakken:
Refleksionsrefleksioner = nye refleksioner (ny ConfigurationBuilder () .setUrls (ClasspathHelper.forPackage ("com.baeldung.reflections")) .setScanners (ny SubTypesScanner (), ny TypeAnnotationsScanner ()) .filterInputsBy (ny FilterBuilderage () (ekskluderPakke). " com.baeldung.reflections.test ")));
Nu indtil nu har vi lavet et hurtigt overblik over de forskellige elementer i Refleksioner'Konfiguration. Derefter ser vi, hvordan vi bruger biblioteket.
4. Forespørgsel ved hjælp af refleksioner
Efter at have ringet til en af Refleksioner konstruktører, scanner de konfigurerede scannere alle de angivne webadresser. Derefter, for hver scanner indsætter biblioteket resultaterne Multimap butikker. Som et resultat, for at bruge Refleksioner, er vi nødt til at forespørge disse butikker ved at kalde de angivne forespørgselsmetoder.
Lad os se nogle eksempler på disse forespørgselsmetoder.
4.1. Undertyper
Lad os starte med at hente alle scannere leveret af Refleksioner:
offentligt sæt getReflectionsSubTypes () {Reflections reflections = new Reflections ("org.reflections", new SubTypesScanner ()); returnere refleksioner.getSubTypesOf (Scanner.class); }
4.2. Kommenterede typer
Dernæst kan vi få alle de klasser og grænseflader, der implementerer en given kommentar.
Så lad os hente alle funktionelle grænseflader til java.util.function pakke:
offentligt sæt getJDKFunctinalInterfaces () {Reflections reflections = new Reflections ("java.util.function", new TypeAnnotationsScanner ()); returnere refleksioner.getTypesAnnotatedWith (FunctionalInterface.class); }
4.3. Annoterede metoder
Lad os nu bruge Metode Annoteringer Scanner for at få alle metoderne kommenteret med en given kommentar:
public Set getDateDeprecatedMethods () {Reflections reflections = new Reflections ("java.util.Date", new MethodAnnotationsScanner ()); returnere refleksioner.getMethodsAnnotatedWith (Forældet.klasse); }
4.4. Kommenterede konstruktører
Vi kan også få alle de forældede konstruktører:
public Set getDateDeprecatedConstructors () {Reflections reflections = new Reflections ("java.util.Date", new MethodAnnotationsScanner ()); returnere refleksioner.getConstructorsAnnotatedWith (Forældet.klasse); }
4.5. Metoders parametre
Derudover kan vi bruge Metode ParameterScanner for at finde alle metoderne med en given parametertype:
public Set getMethodsWithDateParam () {Reflections reflections = new Reflections (java.text.SimpleDateFormat.class, new MethodParameterScanner ()); returnere reflektioner.getMethodsMatchParams (Date.class); }
4.6. Metoders returtype
Desuden kan vi også bruge den samme scanner til at få alle metoderne med en given returtype.
Lad os forestille os, at vi vil finde alle metoderne til SimpleDateFormat den tilbagevenden ugyldig:
public Set getMethodsWithVoidReturn () {Reflections reflections = new Reflections ("java.text.SimpleDateFormat", new MethodParameterScanner ()); returnere refleksioner.getMethodsReturn (ugyldig.klasse); }
4.7. Ressourcer
Lad os endelig bruge RessourcerScanner for at kigge efter et givet filnavn i vores klassesti:
public Set getPomXmlPaths () {Reflections reflections = new Reflections (new ResourcesScanner ()); returnere reflektioner.getResources (Mønster.kompil (". * pom \. xml")); }
4.8. Yderligere forespørgselsmetoder
Ovenstående var kun en håndfuld eksempler, der viser, hvordan man bruger Refleksioner ' forespørgselsmetoder. Alligevel er der andre forespørgselsmetoder, som vi ikke har dækket her:
- getMethodsWithAnyParamAnnotated
- getConstructorsMatchParams
- getConstructorsWithAnyParamAnnotated
- getFieldsAnnotatedWith
- getMethodParamNames
- getConstructorParamNames
- getFieldUsage
- getMethodUsage
- getConstructorUsage
5. Integrering Refleksioner ind i en Build-livscyklus
Vi kan let integrere Refleksioner ind i vores Maven-bygning ved hjælp af gmavenplus-plugin.
Lad os konfigurere det for at gemme resultatet af scanninger i en fil:
org.codehaus.gmavenplus gmavenplus-plugin 1.5 genererer ressourcer udfører
Senere ved at ringe til indsamle() metode, vi kan hente de gemte resultaterog gør dem tilgængelige til yderligere brug uden at skulle udføre en ny scanning:
Refleksioner refleksioner = isProduction ()? Reflections.collect (): nye Reflections ("com.baeldung.reflections");
6. Konklusion
I denne artikel undersøgte vi Refleksioner bibliotek. Vi dækkede forskellige konfigurationselementer og deres anvendelser. Og endelig så vi, hvordan vi kunne integrere Refleksioner ind i et Maven-projekts byggelevecyklus.
Som altid er den komplette kode tilgængelig på GitHub.