[解決済み] 実行時に、Javaアプリケーションでベースクラスを拡張しているすべてのクラスを検索する
質問
このようなことをしたいのですが。
List<Animal> animals = new ArrayList<Animal>();
for( Class c: list_of_all_classes_available_to_my_app() )
if (c is Animal)
animals.add( new c() );
そこで、アプリケーションのユニバースにあるすべてのクラスを見て、Animalの子孫にあたるものを見つけたら、その型の新しいオブジェクトを作成してリストに追加したいのです。 これによって、リストを更新することなく、機能を追加することができる。 次のようなことを避けることができます。
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
上記の方法で、Animalを継承した新しいクラスを作るだけで、自動的にピックアップされるようになった。
UPDATE: 10/16/2008 9:00 a.m.(太平洋標準時)。
この質問には、たくさんの素晴らしい回答が寄せられています。 回答や調査から、私が本当にやりたいことは、Javaでは不可能であることがわかりました。 ddimitrovのServiceLoaderメカニズムなど、動作するアプローチもありますが、私が望むものには非常に重く、単に問題をJavaコードから外部設定ファイルに移動させるだけだと考えています。 19年5月10日更新 (11年後!) 現在では、@IvanNik の記事によると、これを助けることができるいくつかのライブラリがあります。 回答 org.reflections(オルグ・リフレクションズ が良さそうです。また クラスグラフ から、@Luke Hutchison の 回答 は面白そうですね。回答の中にも、さらにいくつかの可能性があります。
私が欲しいものを述べる別の方法:私のAnimalクラスの静的関数は、Animalを継承するすべてのクラスを見つけ、インスタンス化します--さらなる設定/コーディングなしで。 もし設定が必要なら、Animal クラスでインスタンス化したほうがいいかもしれません。 Javaプログラムは.classファイルの緩やかな連合体なので、そういうものなのだと理解しています。
興味深いことに、どうやらこれは かなり些細なこと をC#で作成しました。
どのように解決するのですか?
私は org.reflections(オルグ・リフレクションズ :
Reflections reflections = new Reflections("com.mycompany");
Set<Class<? extends MyInterface>> classes = reflections.getSubTypesOf(MyInterface.class);
別の例
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
Reflections reflections = new Reflections("java.util");
Set<Class<? extends List>> classes = reflections.getSubTypesOf(java.util.List.class);
for (Class<? extends List> aClass : classes) {
System.out.println(aClass.getName());
if(aClass == ArrayList.class) {
List list = aClass.newInstance();
list.add("test");
System.out.println(list.getClass().getName() + ": " + list.size());
}
}
}
関連
-
jd-gui Java Exceptionが発生しました。
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
JSPで「リストが型解決できない!」の解決方法
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] Javaでリストを反復処理する方法
-
[解決済み] リフレクションを使って、パッケージ内のすべてのクラスを見つけることができますか?
-
[解決済み] Mapを実装し、挿入順序を保持するJavaクラス?
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み] Mavenでjarに依存関係を含める
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラー java.util.NoSuchElementException
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
javaの模造品QQ WeChatのチャットルーム
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
マスキング このリソースにアクセスするには、完全な認証が必要です。