1. ホーム
  2. java

[解決済み] リフレクションを使って、パッケージ内のすべてのクラスを見つけることができますか?

2022-03-16 20:08:50

質問

あるパッケージに含まれるすべてのクラスまたはインターフェースを見つけることは可能ですか?(例えば Package と言われると、そうでもないような気がする)

解決方法は?

クラスローダーは動的な性質を持っているため、これは不可能です。クラスローダーはVMにどのクラスを提供できるかを伝える必要はなく、代わりにクラスのリクエストを渡され、クラスを返すか例外を投げなければなりません。

しかし、自分でクラスローダーを書いたり、クラスパスやそのジャーを調べたりすれば、この情報を見つけることは可能です。しかし、これはファイルシステム操作によるものであり、リフレクションではありません。これを手助けしてくれるライブラリもあるかもしれない。

生成されるクラスやリモートで配信されるクラスがある場合、それらのクラスを発見することはできません。

通常の方法は、アクセスしたいクラスをどこかに登録しておくか、別のクラスで参照することになります。あるいは、命名規則に従ってください。

追記 リフレクションズライブラリ を使うと、現在のクラスパスにあるクラスを検索することができます。これはパッケージ内のすべてのクラスを取得するために使用することができます。

 Reflections reflections = new Reflections("my.project.prefix");

 Set<Class<? extends Object>> allClasses = 
     reflections.getSubTypesOf(Object.class);