基本クラスがあるとしましょう:
package mobi.hsz.app.plugin;
abstract class Plugin {}
そして拡張クラス:
package 3rd.party.plugin;
ThirdPartyPlugin extends Plugin {}
基底クラスで拡張クラスのパッケージ名を取得することはできますか?
抽象クラスの単純な文字列を取得する必要があります
3rd.party.plugin
ここでは、小さなリフレクション コードが機能するはずです。
getClass().getPackage().getName()
このgetClass()
メソッドはClass
、インスタンスのオブジェクトを取得し、オブジェクトをgetPackage()
取得して、完全修飾パッケージ名Package
を返します。getName()
Java のポリモーフィズムにより、適切なClass
オブジェクト (ここではThirdPartyPlugin
) が から返されることが保証されgetClass()
ます。
すべてのサブクラスが必要なようです。
もしそうなら、あなたのスーパークラスにすべてのサブクラスの実装を知ってもらうのは悪臭を放ちます - それはOpen Closed Principleに違反します。
これらを取得するための間接的な方法が必要です。標準の Java ソリューションの場合はSPIを試してください。その後、 Base クラスはServiceLoaderを使用して結合せずにそれらを動的に検索できます。
それ以外の場合は、OSGi のような優れたサポート フレームワークを使用している場合は、プラグインを登録するだけです。