Maison >Java >javaDidacticiel >Comment puis-je récupérer dynamiquement les implémentations de l'interface Java ?

Comment puis-je récupérer dynamiquement les implémentations de l'interface Java ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-16 08:43:10278parcourir

How Can I Dynamically Retrieve Java Interface Implementations?

Récupération dynamique des implémentations d'une interface en Java

En programmation orientée objet, il peut être avantageux d'obtenir une liste d'implémentations pour un interface donnée par programme. En Java, cela peut être réalisé grâce à diverses techniques, telles que les réflexions.

Une approche consiste à utiliser la bibliothèque Reflections, qui fournit un mécanisme pratique pour introspecter les classes et extraire les informations sur les classes. Voici comment y parvenir à l'aide de Reflections :

import org.reflections.Reflections;
import org.reflections.SubTypesScanner;

// Define the interface of interest
interface Pet {}

// Implementations of the Pet interface
class Dog implements Pet {}
class Cat implements Pet {}

// Use Reflections to get a list of Pet implementations
Reflections reflections = new Reflections("package.containing.implementations");
Set<Class<? extends Pet>> petImplementations = reflections.getSubTypesOf(Pet.class);

// Iterate over and display the implementations
for (Class<? extends Pet> implementation : petImplementations) {
    System.out.println(implementation.getSimpleName()); // prints Dog, Cat
}

Vous pouvez également utiliser la fonction ServiceLoader de Java pour découvrir les implémentations d'une interface de fournisseur de services (SPI).

import java.util.ServiceLoader;

// Define the Pet interface as an SPI
interface Pet {}

// Implementations of the Pet interface
class Dog implements Pet {}
class Cat implements Pet {}

// Use ServiceLoader to load implemented services
ServiceLoader<Pet> loader = ServiceLoader.load(Pet.class);

// Iterate over and display the implementations
for (Pet implementation : loader) {
    System.out.println(implementation.getClass().getSimpleName()); // prints Dog, Cat
}

Notez que pour cette approche, vous devez spécifier votre interface en tant que SPI en créant un fichier dans le répertoire resources/META-INF/services avec le nom complet de l'interface et en répertoriant les implémentations à l'intérieur.

Une autre option consiste à définir une annotation au niveau du package.

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

// Package-level annotation to define implementations
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PACKAGE)
public @interface MyPackageAnnotation {
    Class<?>[] implementationsOfPet() default {};
}

// Implementations of the Pet interface
class Dog implements Pet {}
class Cat implements Pet {}

// Define the package-level annotation in a package-info.java file
@MyPackageAnnotation(implementationsOfPet = {Dog.class, Cat.class})
package package.containing.implementations;

// Iterate over and display the implementations
Package[] packages = Package.getPackages();
for (Package p : packages) {
    MyPackageAnnotation annotation = p.getAnnotation(MyPackageAnnotation.class);
    if (annotation != null) {
        Class<?>[] implementations = annotation.implementationsOfPet();
        for (Class<?> implementation : implementations) {
            System.out.println(implementation.getSimpleName());
        }
    }
}

Gardez à l'esprit que cette approche ne fonctionnera que pour les packages déjà connus du ClassLoader. Pour une recherche plus exhaustive, pensez aux URLClassLoaders, mais soyez conscient des limitations spécifiques aux classes chargées.

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