- ベストアンサー
リストする派生クラスをStringで表現するデータ形式の管理方法
- Stringで表現する独自のデータ形式に対応するために、abstract class DataType を利用する。
- ManagerOfDataTypeクラスのメソッドを使用して、サポートされているすべてのデータ形式を取得できる。
- データ形式の派生クラスをすべて取得するための最適な方法は、インスタンス生成時にクラス名を登録することで実現できる。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 >一つ考えたのは,パッケージを組んで,パッケージの下に属するすべてのクラスを リストアップするという方法なんですが・・・ そのように、限定をしていいのなら方法はあります。 私がよくやる方法で、プラグイン的な処理です。 概略は、 1.データ形式を表すクラスを、限定したディレクトリに入れておく。 [補足1]通常のクラスパスではないディレクトリにした方が、 扱いやすいし検索速度も上がるため。(経験上) [補足2]ディレクトリには、クラスファイル単独ではなく、 パッケージを表すディレクトリ構造ごと格納すること。 2.そのディレクトリ階層から拡張子.classのファイルを対象として、 自作ClassLoaderでロードする。 [補足]通常のClassLoaderでは、クラスパスからしか読めないためカスタマイズ。 3.読んだClassオブジェクトが、DataTypeのサブクラスならリストへ追加。 [補足]「instanceof」で判断できる。
その他の回答 (1)
- ngsvx
- ベストアンサー率49% (157/315)
やっぱり、ManagerOfDataTypeのコンストラクタで必要な登録をするコードを書くか、 定義ファイルなどを用意しておいて、それを読むしかないのでは? 何の指示もせず、ManagerOfDataTypeのインスタンスを生成しただけでリストを作るのは無理があると思いますけど。 DataTypeを継承したクラスがどこにあるか分からないし、 本当にリストに追加していいのかも判断できない。
お礼
回答ありがとうございます。 >DataTypeを継承したクラスがどこにあるか分からないし、 本当にリストに追加していいのかも判断できない。 とりあえず、派生クラス名さえ集められれば、java.lang.ClassのgetSuperclassを使って、DataType型から派生しているかどうかは分かるんですが。内部クラスやメンバクラスをリストする関数はあるのに、派生クラスをリストする関数はないんです。 やはり無理なんでしょうかねぇ。一つ考えたのは,パッケージを組んで,パッケージの下に属するすべてのクラスをリストアップするという方法なんですが・・・これも、同じように、クラス名が分かっているときに、その所属がどのパッケージかを示す関数はあるんですが、逆の方法がわかりません。 ManagerOfDataTypeは、別にstaticでもいいんですが・・・
お礼
お礼が非常に遅くなってしまい、大変申し訳ありません。 結局、単に自動的に読み込めた方がきれい、というだけの問題でどうしても必要な機能ではなかったため、実装せずに一つ一つクラスを追加する方法で解決させてしまいました。せっかくの回答を生かせずに申し訳ありません。 ただ、結果的に方法がある、と分かっただけでも幸いです。やはり、自作クラスローダを使わないと無理だったのですね....技術的にはいろんなところで使えそうです。勉強になりました。覚えておこうと思います。 回答ありがとうございました。