Я работаю над проектом, и одно требование заключается в том, что если второй аргумент для основного метода начинается с « /
» (для linux), он должен рассматривать его как абсолютный путь (не проблема), но если он не начинается с « /
”, Он должен получить текущий рабочий путь класса и добавить к нему заданный аргумент.
Я могу получить имя класса несколько способов: System.getProperty("java.class.path")
, new File(".")
и getCanonicalPath()
, и так далее ...
Проблема в том, что это дает мне только каталог, в котором хранятся пакеты - то есть, если у меня есть класс, хранящийся в " .../project/this/is/package/name
", он дал бы мне только " /project/
" и игнорировал бы имя пакета, в котором на самом деле .class files
живет.
Какие-либо предложения?
РЕДАКТИРОВАТЬ: вот объяснение, взятое из описания упражнения.
sourcedir может быть абсолютным (начиная с «/») или относительно того, откуда мы запускаем программу.
sourcedir - это заданный аргумент для основного метода. как мне найти этот путь?
Ответы:
Используйте,
this.getClass().getCanonicalName()
чтобы получить полное имя класса.Обратите внимание, что имя пакета / класса («abC») отличается от пути к файлам .class (a / b / C.class), и что использование имени пакета / имени класса для получения пути обычно является плохой практикой. Наборы файлов / пакетов классов могут иметь несколько разных путей к классам, которые могут быть каталогами или файлами jar.
источник
Есть класс
Class
, который может это сделать:Class c = Class.forName("MyClass"); // if you want to specify a class Class c = this.getClass(); // if you want to use the current class System.out.println("Package: "+c.getPackage()+"\nClass: "+c.getSimpleName()+"\nFull Identifier: "+c.getName());
Если
c
бы класс был представленMyClass
в пакетеmypackage
, приведенный выше код напечатал бы:Вы можете взять эту информацию и изменить ее так, как вам нужно, или проверить API для получения дополнительной информации.
источник
getName()
возвращает имя пакета вместе с именем класса, сейчас редактируем.getSimpleName()
чтобы получить только имя класса без имени пакета.Class.forName("MyClass")
вы должны использовать,MyClass.class
если вам действительно не нужно обнаружение времени выполнения по какой-либо другой причине.Полное имя получается следующим образом:
Но вам нужно прочитать ресурс пути к классам. Так что используйте
InputStream in = YourClass.getResourceAsStream("resource.txt");
источник
использовать
this.getClass().getName()
для полученияpackageName.className
и использоватьthis.getClass().getSimpleName()
для получения только имени классаисточник