Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Dapatkan Secara Dinamik Pelaksanaan Antara Muka Java?

Bagaimanakah Saya Boleh Dapatkan Secara Dinamik Pelaksanaan Antara Muka Java?

Susan Sarandon
Susan Sarandonasal
2024-12-16 08:43:10207semak imbas

How Can I Dynamically Retrieve Java Interface Implementations?

Mengambil Secara Dinamik Antara Muka dalam Java

Dalam pengaturcaraan berorientasikan objek, ia boleh memberi manfaat untuk mendapatkan senarai pelaksanaan untuk antara muka yang diberikan secara pemrograman. Di Jawa, ini boleh dicapai melalui pelbagai teknik, seperti refleksi.

Salah satu pendekatan ialah menggunakan perpustakaan Reflections, yang menyediakan mekanisme yang mudah untuk introspeksi kelas dan mengekstrak maklumat kelas. Begini cara anda boleh mencapainya menggunakan 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
}

Sebagai alternatif, anda boleh menggunakan kemudahan ServiceLoader Java untuk menemui pelaksanaan bagi antara muka pembekal perkhidmatan (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
}

Perhatikan bahawa untuk pendekatan ini, anda mesti menentukan antara muka anda sebagai SPI dengan mencipta fail dalam direktori sumber/META-INF/perkhidmatan dengan antara muka nama yang layak sepenuhnya dan menyenaraikan pelaksanaan dalam.

Pilihan lain melibatkan penentuan anotasi peringkat pakej.

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());
        }
    }
}

Perlu diingat bahawa pendekatan ini hanya akan berfungsi untuk pakej yang telah diketahui oleh ClassLoader . Untuk carian yang lebih lengkap, pertimbangkan URLClassLoaders, tetapi berhati-hati dengan pengehadan khusus untuk kelas yang dimuatkan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Dapatkan Secara Dinamik Pelaksanaan Antara Muka Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn