Java でのプログラミングによるインターフェイス実装の包括的なリストの取得
Java では、プログラムによってインターフェイス実装のコレクションを取得する必要が生じることがよくあります。特定のインターフェイスを実装するクラス。これはさまざまなアプローチを通じて実現できますが、その中にはリフレクションやその他の特殊なテクニックの利用が含まれます。
リフレクション ライブラリの使用: リフレクション
リフレクション ライブラリは便利な方法を提供します。クラスのメタデータと関係を検査します。 Reflections インスタンスを利用すると、次の例に示すように、目的のインターフェイスを拡張するクラスのセットを取得できます。
Reflections reflections = new Reflections("firstdeveloper.examples.reflections"); Set<Class<? extends Pet>> classes = reflections.getSubTypesOf(Pet.class);
ServiceLoader の採用
ServiceLoaderは、実行時にサービス プロバイダー実装を検索してロードするためのメカニズムを提供します。この手法を利用してインターフェイス実装を取得するには、ServiceProviderInterface (SPI) を定義し、その実装を宣言します。次のコードは、このアプローチを示しています。
ServiceLoader<Pet> loader = ServiceLoader.load(Pet.class); for (Pet implClass : loader) { System.out.println(implClass.getClass().getSimpleName()); // prints Dog, Cat }
パッケージ レベルのアノテーションを利用する
もう 1 つの方法には、パッケージ レベルのアノテーションを使用する方法があります。このアプローチでは、インターフェイスの実装を指定するカスタム アノテーションを作成する必要があります。次のコード サンプルは、アノテーションを定義する方法を示しています。
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PACKAGE) public @interface MyPackageAnnotation { Class<?>[] implementationsOfPet() default {}; }
パッケージ内でアノテーションを宣言するには、package-info.java という名前のファイルを作成し、次の内容を含めます。
@MyPackageAnnotation(implementationsOfPet = {Dog.class, Cat.class}) package examples.reflections;
その後、次のコードを使用してインターフェイス実装を取得できます:
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()); } } }
以上がJava でのインターフェイス実装の完全なリストをプログラムで取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。