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!