Подтвердить что ты не робот

Где на файловой системе был загружен мой Java-класс?

Я думаю, что это ситуация, с которой сталкивается каждый программист Java, если они делают это достаточно долго. Вы выполните некоторую отладку и внесите изменения в класс. Когда вы переходите на перезапуск программы, эти изменения, похоже, не подбираются, а старый класс все еще работает. Вы очищаете и перестраиваете все, одну и ту же проблему. Иногда это может быть связано с проблемой classpath, из того же класса, что и в пути к классам более одного раза, но, похоже, нет простого способа выяснить, откуда загружается класс...

Есть ли способ найти путь к файлу для загруженного класса? Желательно, чтобы что-то работало, если класс был загружен из файла .class или файла .jar. Любые идеи?

4b9b3361

Ответ 1

Просто запустите java, используя стандартный переключатель командной строки "-verbose:class" (см. документация java). Это будет печататься каждый раз, когда класс загружается и сообщает, откуда он загружен.

Ответ 2

Если вы хотите сделать это программно изнутри приложения, попробуйте:

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

(Обратите внимание, что getCodeSource() может возвращать значение null, поэтому на самом деле это не делается в одной строке:))

Ответ 3

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));       
}

Пример вывода:   баночка: Файл:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar/java/lang/String.class

Ответ 4

Поскольку класс должен происходить откуда-то в пути класса, я бы рекомендовал просто распечатать путь класса и проверить, есть ли более старую версию вашего класса.