いいえ、これは完全に信頼できる方法ではありません。しかし、多くの場合、実装するのが現実的かもしれません。
Javaクラスローダーの柔軟性により、特定のパッケージの下で定義されたクラスは、実行時に認識されないことがあります(例えば、クラスをネットワーク上からロードすることによってオンザフライで定義する特殊なクラスローダーを考えたり、それらをアドホックにコンパイルする)。そのため、パッケージ内のクラスを一覧表示できる標準のJava APIはありません。
しかし実際には、すべてのクラスとJARファイルのクラスパスを検索し、完全修飾クラス名のコレクションを作成し、必要に応じてそれらを検索することで、いくつかのトリックを行うことができます。前の段落で説明したようにアクティブなクラスローダーが動作しないことが確実であれば、この戦略はうまくいきます。たとえば、(Java擬似コード):
Map<String, Set<String>> classesInPackage = new HashMap();
for (String entry : eachClasspathEntry()) {
if (isClassFile(entry)) {
String packageName = getPackageName(entry);
if (!classesInPackage.containsKey(packageName)) {
classesInPackage.put(packageName, new HashSet<String>());
}
classesInPackage.get(packageName).add(getClassName(entry));
} else if (isJarOrZipFile(entry)) {
// Do the same for each JAR/ZIP file entry...
}
}
classesInPackage.get("com.foo.bar"); // => Set<String> of each class...
「このパッケージにクラスを追加する」とは何ですか?どのようにそれはJavaプロセスのクラスパスに入るのですか? –
@Jeffrey私はReflectionについて読んでいましたが、私はこれが唯一の方法だと思っていますが、私はReflectionについて何も知らないのです。私はそのパッケージにある各クラスの検証を追加する "普通の方法"を試みましたが、拡張可能ではないので、この方法は望ましくありません。 –
@MiserableVariable開発時に、パッケージに新しいクラスを追加します(すべてのクラスはDocumentという抽象クラスを拡張します)。 –