Obtention par programmation d'une liste des implémentations d'interface en Java
Explorer différentes manières d'obtenir une liste de toutes les implémentations d'une interface en Java, cet article plonge dans les domaines de la réflexion et d'autres techniques.
Réflexion avec réflexions Bibliothèque
Si l'incorporation d'une dépendance supplémentaire n'est pas un problème, la bibliothèque de réflexions offre une solution pratique. Il vous permet de récupérer les informations souhaitées avec un code concis :
Reflections reflections = new Reflections("firstdeveloper.examples.reflections"); Set<Class<? extends Pet>> classes = reflections.getSubTypesOf(Pet.class);
ServiceLoader et SPI
ServiceLoader, comme mentionné précédemment, utilise l'interface du fournisseur de services (SPI) modèle. Cette approche nécessite que vous déclariez Pet comme SPI et que vous spécifiiez ses implémentations dans un fichier resources/META-INF/services/ spécifique. Le code de cette méthode est le suivant :
ServiceLoader<Pet> loader = ServiceLoader.load(Pet.class); for (Pet implClass : loader) { System.out.println(implClass.getClass().getSimpleName()); // prints Dog, Cat }
Annotation au niveau du package
L'approche d'annotation au niveau du package définit une annotation dans un package-info.java fichier dans un package spécifique, spécifiant les implémentations d’une interface. L'utilisation de cette technique est démontrée ci-dessous :
Annotation du package :
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PACKAGE) public @interface MyPackageAnnotation { Class<?>[] implementationsOfPet() default {}; }
Package-info.java :
@MyPackageAnnotation(implementationsOfPet = {Dog.class, Cat.class}) package examples.reflections;
Code :
Package[] packages = Package.getPackages(); for (Package p : packages) { MyPackageAnnotation annotation = p.getAnnotation(MyPackageAnnotation.class); if (annotation != null) { Class<?>[] implementations = annotation.implementationsOfPet(); for (Class<?> impl : implementations) { System.out.println(impl.getSimpleName()); } } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!