2009-11-29 8 views
15

javaコードベースに "com.example"というパッケージがあるとします。クラスローダはまだロードされていない場合 - 実行時にどのクラスもロードされていなくても、クラスローダーがパッケージをロードするように強制する方法はありますか?

、我々は

Package p = Package.getPackage("com.example"); //(returns null) 

かさえ問題がある

Packages[] ps = Package.getPackages(); 

を呼び出すことにより、すべてのパッケージの一覧を取得を呼び出すことによって、このパッケージを取得することができますこれらの関数呼び出しでは使用できません。私たちはこのように、最初のパッケージに力負荷によってパッケージをロードするためのクラスのいずれかをそれを強制することができます

this.getClass().getClassLoader().loadClass("com.example.SomeClass"); 
Package p = Package.getPackage("com.example"); //(returns non-null) 

をしかし、これはハックされ、事前に属するいくつかのクラスの名前を知る必要がその包み。

ですから、ClassLoaderが何かを行ったかどうかにかかわらず、名前でPackageのインスタンスを取得する方法はありますか?この状況でクラスローディング/パッケージがどのように正しく動作するかについての私の前提はありますか?

+0

https://stackoverflow.com/questions/3455267/why-does-class-getpackage-return-the-same-package-for-classes-from-different-pacの用心 – Vadzim

答えて

11

また、クラスルートディレクトリを開始点として使用して、すべての* .classファイルとサブディレクトリを処理できます。これは、すべての.classファイルがあらかじめ存在する場所を知っている場合にのみ機能します。

これは、Javaには動的なクラスローディングがあるため、コンパイル時または起動時に知られていない場所から実行時にクラスをロードできることです。したがって、パッケージの概念は、ロードされたクラスの名前空間に過ぎず、それらを検索するためのディレクトリではありません。

5

あなたの前提が無効であることを恐れています。クラスローダーは、クラスをロードするときに、ブック保管をパッケージ化します。

ClassLoader.getResourcesにワイルドカードを渡して、強制的にワイルドカードでパッケージ内のクラスを取得することができます。

definePackageを呼び出す独自のClassLoaderを作成することはできますが、通常のバニラクラスローダーの使用には役立ちません。

5

注釈を調べる必要があるため、必要と思われます。さもなければ、アノテーションにアクセスするだけの操作しかないパッケージ参照を持つことには興味はありません。これは、そこにいくつかの注釈があるpackage-info.javaも定義されているという前提につながります。

java.lang.Packageをチェックすると、getPackageInfoは通常のクラスとしてpackage-infoクラスをロードするだけです。

私は同じ問題があり、この解決策を考え出しました。

public static Package getPackage(String packageName) throws ClassNotFoundException { 
    Class.forName(packageName+".package-info"); // makes sure package info exist and that the class loader already knows about the package 
    return Package.getPackage(packageName); 
} 
関連する問題