25

これは、すべてのJavaプログラマーが十分な長さでそれを行う場合に遭遇する状況だと思います。デバッグを行って、クラスに変更を加えています。プログラムを再実行しようとすると、これらの変更は反映されていないように見えますが、古いクラスはまだ実行されているようです。同じ問題で、すべてをクリーンアップして再構築します。同じクラスが複数回クラスパス上にあるというクラスパスの問題が発生する場合がありますが、ロードされているクラスがどこから来ているのかを簡単に把握する方法はないようです...

ロードされたクラスのファイルパスを見つける方法はありますか?.classクラスがファイルまたはファイルからロードされた場合に機能する好ましいもの.jar。何か案は?

4

4 に答える 4

30

java標準のコマンドラインスイッチ""を使用して実行するだけです-verbose:classドキュメントを参照)。これにより、クラスが読み込まれるたびに出力され、どこから読み込まれたかがわかります。java

于 2009-04-22T23:25:52.007 に答える
15

アプリケーション内からプログラムで実行したい場合は、次を試してください。

URL loc = MyClass.class.getProtectionDomain().getCodeSource().getLocation();

(getCodeSource()はnullを返す可能性があるため、実際にはこれをすべて1行で実行しないでください:))

于 2009-04-22T23:26:44.563 に答える
5
public static URL getClassURL(Class klass) {
    String name = klass.getName();
    name = "/" + convertClassToPath(name);
    URL url = klass.getResource(name);
    return url;
}

public static String convertClassToPath(String className) {
    String path = className.replaceAll("\\.", "/") + ".class";
    return path;
}

これをどこかに貼り付けて、定義を見つけたいクラスのClassオブジェクトを渡します。検索対象のクラスでgetResource()を呼び出すため、どこから呼び出したかに関係なく機能するはずです。

public static void main(String[] args) {
    System.out.println(getClassURL(String.class));       
}

出力例:jar:file:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar!/java/lang/String.class

于 2009-04-22T23:38:15.610 に答える
0

クラスはクラスパスのどこかから取得する必要があるため、クラスパスを印刷して、古いバージョンのクラスがどこかにあるかどうかを確認することをお勧めします。

于 2009-04-22T23:27:46.963 に答える