0

私は開発中の Java ライブラリでGoogle Reflectionsを使用しています。リフレクションを使用する理由は、特定の注釈を持つすべてのクラスを見つけたいからです。単純化すると、私のライブラリには、これらのクラスに応答するメソッドがあり、次のような行で呼び出されます。

//this method uses the Reflections library
Repository.getDefault().getMyAnnotatedClasses()

私のライブラリの現在のバージョンでは、リフレクション ライブラリが注釈付きのクラスを探す必要があるパッケージ名を明示的に追加するようユーザーに要求します。

Repository.getDefault().addSearchPath("...");

このようにして、リフレクションはそのパッケージにのみ存在するクラスを探します。

ライブラリのユーザーがこの検索パスを追加しない場合は、システム クラス ローダーのすべてのクラスを検索するように Reflections を構成します。明らかに、このソリューションは非常に非効率的です。ただし、ユーザーに常に検索パスを設定するように求めるという要件を本当に取り除きたいと思っています。- 重要な場合の注意点: Reflections では、パッケージ名、url (クラスを見つけることができるクラスパス)、またはクラス ローダーを使用して検索パスを構成できます。

だから私の質問は:私のライブラリを呼び出すクラスのクラスパスを見つける方法はありますか? (私のライブラリコードから)。このようにして、ユーザーが検索場所を明示的に設定していない場合、デフォルトでその場所を追加することを検出できました。これは、システム クラス ローダー全体を代替検索パスとして追加するよりも優れたソリューションと思われます。

ライブラリ コードからメソッド コール スタックを手動で検査できることはわかっていますが、これは少しハックで汚れたソリューションのように思われるため、別のアイデアを探しています。

前もって感謝します。

4

1 に答える 1

0

スタックトレースを分析することで、メソッドの呼び出し元を見つけることができます。一般的なIMHOはカプセル化を破り、管理された環境(プロキシなど)に敏感であるため、良い考えではありませんが、機能します。この質問でもっと見てください。

他にできることは、すべてのクラスパスを毎回スキャンする非効率性を回避するために、リフレクションを使用してコンパイル時に1回スキャンして保存し、ブートストラップ時に収集することです。

スキャンしてXMLとして1回保存するには:

new Reflections(...).save([somepath]);

そして、スキャンせずに収集するよりも:

Reflections reflections = Reflections.collect([somepath]);

Mavenを使用している場合は、それを自動化し、Reflections-Mavenプラグインを使用してすべてのビルドの一部として実行できます。

Reflections UseCases Wikiページで、事前にスキャンされたメタデータの収集で詳細を確認してください

于 2013-03-10T10:05:19.873 に答える