0

私の現在のプロジェクトでは、いくつかの構成データをパッケージ注釈に保存し、いくつかの CDI プロデューサーからアクセスしたいと考えています。注釈が現在のパッケージで見つからない場合、プロデューサーはパッケージ階層の上方でそれを検索します。

ここまでは順調ですね。残念ながらPackage.getPackage("my.package")、クラスまたはインターフェースのいずれかに最初にアクセスした後にのみ、既存のパッケージにアクセスできるようです。

次の例は、この動作を示しています。

クラスインパッケージa.b

package a.b;

public class ClassInMitte {
}

パッケージにアクセスするプログラム例oben.mitte

package other;

public class Refl {
    public static void main(String[] args)
    {
        Package viaName = Package.getPackage("a.b");

        System.out.println(viaName.getName());
        System.out.println(viaName.hashCode());
    }
}

実行Reflすると、NullPointerException. しかし、最初のステートメントとして追加するnew ClassInMitte()と、パッケージ情報にアクセスできます。どういうわけか、パッケージ情報自体にアクセスする前に、パッケージのコンテンツにアクセスする必要があります。そうしないと、クラスローダーは開始時にクラスパス全体をスキャンする必要があるため、これは理にかなっています。

しかし、以前にパッケージのコンテンツにアクセスせずにパッケージ情報にアクセスする簡単な方法はありますか? リフレクションのようなフレームワークを使用できることはわかっていますが、「軽量」ソリューションが私の好みのソリューションです。

4

1 に答える 1

1

Package.getPackageは、現在のクラス ローダーが既に認識しているパッケージのみを返します。これを行う唯一の方法は、そのパッケージからクラスをロードすることです。これは基本的に のラッパーですClassLoader.getPackage

于 2013-07-07T20:08:04.510 に答える