206

Javaクラスローダーが実際にクラスをロードする場所をプログラムで見つける方法を知っている人はいますか?

私はしばしば、クラスパスが非常に長くなり、手動検索が実際にはオプションではない大規模なプロジェクトに取り組んでいます。私は最近、2 つの異なる場所のクラスパス上にあるため、クラスローダが誤ったバージョンのクラスをロードするという問題が発生しました。

では、実際のクラス ファイルがディスク上のどこから来ているかをクラスローダーに教えてもらうにはどうすればよいでしょうか。

編集:クラスローダーが実際にバージョンの不一致 (またはその他の原因) のためにクラスのロードに失敗した場合はどうなりますか?

4

11 に答える 11

205

次に例を示します。

package foo;

public class Test
{
    public static void main(String[] args)
    {
        ClassLoader loader = Test.class.getClassLoader();
        System.out.println(loader.getResource("foo/Test.class"));
    }
}

これは出力されました:

file:/C:/Users/Jon/Test/foo/Test.class
于 2008-10-22T21:15:09.013 に答える
107

(ソースを操作せずに) クラスがどこからロードされているかを調べる別の方法は、次のオプションを使用して Java VM を起動することです。-verbose:class

于 2008-10-23T07:16:01.980 に答える
92
getClass().getProtectionDomain().getCodeSource().getLocation();
于 2008-10-22T21:39:59.837 に答える
28

これが私たちが使用するものです:

public static String getClassResource(Class<?> klass) {
  return klass.getClassLoader().getResource(
     klass.getName().replace('.', '/') + ".class").toString();
}

これは、ClassLoader の実装に応じて機能します。 getClass().getProtectionDomain().getCodeSource().getLocation()

于 2008-10-22T21:53:58.637 に答える
5

最初の行だけを編集: Main.class

Class<?> c = Main.class;
String path = c.getResource(c.getSimpleName() + ".class").getPath().replace(c.getSimpleName() + ".class", "");

System.out.println(path);

出力:

/C:/Users/Test/bin/

多分悪いスタイルですが、うまくいきます!

于 2015-04-22T15:49:31.250 に答える
1

この同様の質問を見てください。 同じクラスを発見するツール..

最も関連性の高い障害は、カスタム クラスローダー (db または ldap からの読み込み) がある場合だと思います。

于 2008-10-22T20:49:18.533 に答える
-1

という名前のクラスで作業していると仮定するとMyClass、次のように動作するはずです。

MyClass.class.getClassLoader();

.class ファイルのディスク上の場所を取得できるかどうかは、クラスローダー自体に依存します。たとえば、BCEL のようなものを使用している場合、特定のクラスにはディスク上の表現さえない場合があります。

于 2008-10-22T20:46:37.167 に答える