2009-04-22 5 views
20

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

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

+0

Это почти такой же, как следующий вопрос, который имеет несколько разные ответы: http://stackoverflow.com/questions/947182/how-to-explore-which-classes-are-loaded-from-which-jars –

ответ

26

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

+0

Собственно, любой JVM, поскольку -verbose является обязательным флагом, не так ли. Флаги -X зависят от поставщика. –

+0

Спасибо, я упомянул об этом. –

13

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

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

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

+0

getProtectionDomain также может возвращать значение null (как правило, для классов загрузки). Мой вопрос: если изменения не отображаются, как вы запускаете этот код? :) –

0

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

+3

Собственно, больше неправда. Существуют системные классы, каталоги расширения (да, множественное число), динамически расширяемые загрузчики классов (ala URLClassLoader). В эти дни, когда класс действительно появился, возможно, довольно сложно. –

+0

-1, потому что неточно (см. Комментарий к программе Monkey) –

+0

Как можно было бы печатать путь к классу? Ссылка, которую вы предоставляете, сломана. – Dezza

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

Просто вставьте это где-нибудь и передайте ему объект класса для класса, который вы хотите найти. Он должен работать независимо от того, откуда он звонил, поскольку он вызывает 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

Смежные вопросы