Maison >Java >javaDidacticiel >Comment puis-je obtenir par programme une liste des implémentations de l'interface Java ?

Comment puis-je obtenir par programme une liste des implémentations de l'interface Java ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-09 07:48:07921parcourir

How Can I Programmatically Get a List of Java Interface Implementations?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn