インポートせずにコンパイル単位で参照できる JRE クラスをプログラムで見つける必要があります (静的コード分析のため)。パッケージローカル クラスは無視できます。JLS によると、パッケージのクラスjava.lang
は暗黙的にインポートされます。出力は、バイナリ クラス名のリストである必要があります。このソリューションは、プレーンな Java 5 以降 (Guava、Reflectionなどなし) で動作し、ベンダーに依存しない必要があります。
信頼できる Java ベースのソリューションであれば、大歓迎です。
これまでに試したことに関するメモを次に示します。
一見すると、問題は「パッケージからすべてのクラスをロードする方法は?」に要約されるように見えますが、これはもちろん事実上不可能ですが、いくつかの回避策があります (たとえば、これとこれ、およびそこにリンクされているブログ投稿)。しかし、複数のクラスローダーの問題が存在しないため、私の場合ははるかに単純です。java.lang
システム/ブートストラップ クラスローダによって常に何かをロードでき、そのパッケージに独自のクラスを作成することはできません。問題は、システムのクラスローダーが、リンクされたアプローチが依存するクラスパスを公開しないことです。
これまでのところ、システム クラスローダーのクラス パスにアクセスできませんでした。これは、使用している HotSpot VM で をObject.class.getClassLoader()
返しnull
、委譲によってThread.currentThread().getContextClassLoader()
ロードできますjava.lang.Object
が、それ自体にはクラスパスが含まれていないためです。したがって、このような解決策は私にはうまくいきません。また、保証されたシステム プロパティのリストには、この種のクラスパス情報 ( などsun.boot.class.path
) を持つプロパティは含まれません。
rt.jarが存在すると想定する必要がまったくなく、システム クラスローダーが使用するリソースのリストをスキャンする必要がなかったとしたら、それは素晴らしいことです。このようなアプローチは、ベンダー固有の JRE 実装に関してより安全です。