Java のインターフェイス実装のリストをプログラムで取得する
Java のインターフェイスのすべての実装のリストを取得するさまざまな方法を検討します。この記事では、リフレクションなどの領域について詳しく説明します。
Reflections Library によるリフレクション
追加の依存関係を組み込むことが問題ではない場合は、Reflection ライブラリが便利なソリューションを提供します。簡潔なコードで必要な情報を取得できます。
Reflections reflections = new Reflections("firstdeveloper.examples.reflections"); Set<Class<? extends Pet>> classes = reflections.getSubTypesOf(Pet.class);
ServiceLoader と SPI
ServiceLoader は、前述したように、サービス プロバイダー インターフェイス (SPI) を利用します。モデル。このアプローチでは、Pet を SPI として宣言し、特定の resource/META-INF/services/ ファイルでその実装を指定する必要があります。このメソッドのコードは次のとおりです。
ServiceLoader<Pet> loader = ServiceLoader.load(Pet.class); for (Pet implClass : loader) { System.out.println(implClass.getClass().getSimpleName()); // prints Dog, Cat }
パッケージレベルの注釈
パッケージレベルの注釈アプローチでは、package-info.java で注釈を定義します。特定のパッケージ内のファイルで、インターフェイスの実装を指定します。この手法の使用法を以下に示します。
パッケージ注釈:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PACKAGE) public @interface MyPackageAnnotation { Class<?>[] implementationsOfPet() default {}; }
パッケージ情報.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 サイトの他の関連記事を参照してください。