Heim >Java >javaLernprogramm >Wie kann ich Java-Schnittstellenimplementierungen dynamisch abrufen?
Dynamisches Abrufen von Implementierungen einer Schnittstelle in Java
Bei der objektorientierten Programmierung kann es hilfreich sein, eine Liste von Implementierungen für a zu erhalten gegebene Schnittstelle programmgesteuert. In Java kann dies durch verschiedene Techniken erreicht werden, beispielsweise durch Reflektionen.
Ein Ansatz besteht darin, die Reflections-Bibliothek zu verwenden, die einen praktischen Mechanismus zum Introspizieren von Klassen und Extrahieren von Klasseninformationen bietet. So können Sie dies mit Reflections erreichen:
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 }
Alternativ können Sie die ServiceLoader-Funktion von Java nutzen, um Implementierungen für eine Service-Provider-Schnittstelle (SPI) zu entdecken.
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 }
Beachten Sie, dass für Bei diesem Ansatz müssen Sie Ihre Schnittstelle als SPI angeben, indem Sie im Verzeichnis resources/META-INF/services eine Datei mit dem vollständig qualifizierten Namen der Schnittstelle erstellen und diese auflisten Implementierungen innerhalb.
Eine weitere Option besteht darin, eine Annotation auf Paketebene zu definieren.
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()); } } }
Beachten Sie, dass dieser Ansatz nur für Pakete funktioniert, die dem ClassLoader bereits bekannt sind. Für eine umfassendere Suche ziehen Sie URLClassLoaders in Betracht, beachten Sie jedoch die Einschränkungen, die für geladene Klassen gelten.
Das obige ist der detaillierte Inhalt vonWie kann ich Java-Schnittstellenimplementierungen dynamisch abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!