Откуда в файловой системе был загружен мой класс Java? - PullRequest
23 голосов
/ 23 апреля 2009

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

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

Ответы [ 4 ]

28 голосов
/ 23 апреля 2009

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

14 голосов
/ 23 апреля 2009

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

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

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

5 голосов
/ 23 апреля 2009
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

0 голосов
/ 23 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...