他の人が提案しているクラスパススキャナにはあまり慣れていません。彼らは、理想的ではないにしても堅牢なソリューションのように見えます。
ソースを制御できる場合は、アノテーション処理を使用できます。
スタティックメンバーがMap<String,Foo>
のMapClass
クラスを作成するアノテーションプロセッサを作成します。注釈プロセッサは、@ Name注釈に遭遇するたびに、それをMapClass
のソースコードに追加する。注釈の処理が終了すると、マップをハードコーディングした場合と同じ効果が得られます。
コンパイル時にアノテーション処理が行われます。あなたのプロジェクトのいくつかのクラスがあなたによってコンパイルされていない場合。たとえば、他の人がクラスをコンパイルしてjarファイルを与えると、簡単には動作しません。しかし、すべてのクラスがあなたによってコンパイルされていれば、それは問題ではありません。
アノテーションプロセッサを作成するには、AbstractProcessor
を拡張します。 @ SupportedAnnotationTypes ("Name")
注釈でクラスに注釈を付ける必要があります(名前が注釈の完全修飾名であることを確認してください)。
process
メソッドをオーバーライドします。 process
は、2つのパラメータ:annotations
とroundEnv
を持っています。 annotations
は、この特定のプロセッサがサポートしているアノテーションのセットです。あなたのケースでは(Name)でなければなりません。 roundEnv
は有用なユーティリティクラスです。
annotations
で1つの注釈を繰り返します。 roundEnv
〜getElementsAnnotatedWith
を使用してください。これにより、@Name
アノテーションを持つすべての要素のセットが得られます。
AbstractProcessor
には、別のユーティリティーメンバー - processingEnv
があります。そのgetFiler
メソッドをcreateSourceFile
に使用してください。
コンパイルを少し修正する必要があります。プロセッサを別々に、他のクラスの前にコンパイルする必要があります。プロセッサがコンパイルされ、他のクラスをコンパイルした後、プロセッサについてコンパイラに通知する必要があります。コマンドラインを使用している場合は、-processorpath /path/to/processor/class[es]
と-processor qualified.name.of.processor
を追加します。
クラスパススキャナと比較したこのアプローチの利点は、すべてがコンパイル時に発生することです。たとえば、Bar
要素に誤って@Name
注釈を追加した場合、プロセッサにコンパイル時エラーが発生する可能性があります(プロセッサが無視できるようにしたい場合)。その後、製品出荷前に修正することができます。クラスパススキャナでは、スローされるエラーは実行時エラーです。これはユーザーに表示されます。
このアプローチの欠点は、すべてがコンパイル時に発生することです。これにより、クラスをプロジェクトに動的に追加することが難しくなります。
Javaでは? unixのcmd行を使用すると、find + grep – ControlAltDel
@ user1291492を使用するとかなり簡単になります。保持はRUNTIMEです。このメソッドは、ソースコードにアクセスすることも、アクセスしないこともあります。 OTH、おそらくクラスファイルはgreppableです。 – emory
少し話題になっていますが、なぜ「Set」が必要ですか? 'Map 'や名前のポイントは何かを作る方が意味があるようです。 –
emory