Java: URL.getPath () текущего класса "main" возвращает "null", почему? - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь напечатать текущий путь класса, который выполняет main (), как показано ниже.Я нашел приведенные ниже утверждения из Google, но на моем компьютере это не работает (windows + intellij)

public class core3 {
    public static void main(String[] args) {
        try {
            URL url = new core3().getClass().getClassLoader().getResource("");
            System.out.println(url);
            System.out.println(System.getProperty(url.getPath()));//print null
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

На самом деле он печатает

file:/D:/Documents/myproject/test01/target/classes/
null

Почему второй отпечаток возвращает ноль?Как это исправить?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Почему вторая печать возвращает ноль?

Поскольку вы пытаетесь найти системное свойство, которое не существует.

Это не способ найтипуть к основному классу.

Что вам нужно сделать, это:

  1. Получить полное (или каноническое) имя для класса;например,

      String name = Main.class.getCanonicalName();
    
  2. Сопоставьте это с путем к ресурсу для файла ".class".Вам необходимо:

    • заменить все "."символы в полном имени класса с "/", а затем
    • добавьте ".class".
  3. Используйте getResource(resourcePath) для поиска URL.

Если полученный URL-адрес является URL-адресом «file:», вы можете использовать URL::toFile(), чтобы получить путь в файловой системе.

Но если URL является URL "jar:" (как это будет, если вы загрузили класс из файла JAR), у класса не будет пути к файловой системе.


Обратите внимание, что getClassLoader().getResource("") дает вам путь к корневому каталогу загрузчика классов.Это не путь к исходному классу.


И если вам нужно имя класса JVM, который вызывает ваш метод static void main(String[]), то вы сможете получить его, используя Java 9+ StackWalker класс ( javadoc ).Я думаю, вам нужно будет использовать опцию, чтобы показать скрытые рамки.

0 голосов
/ 24 ноября 2018

System.getProperty () для получения системных свойств.Например, системное свойство "java.home" обычно указывает на местоположение вашей установки Java.Свойства системы описаны здесь .

Ваш код ищет системное свойство с ключом, равным вашему URL.У вас не определено такое системное свойство, поэтому System.getProperty() возвращает null.

Если вы просто хотите напечатать путь, вам следует просто пропустить вызов System.getProperty():

System.out.println(url.getPath());
...