Как получить текущее имя класса, включая имя пакета в Java?

82

Я работаю над проектом, и одно требование заключается в том, что если второй аргумент для основного метода начинается с « /» (для linux), он должен рассматривать его как абсолютный путь (не проблема), но если он не начинается с « /”, Он должен получить текущий рабочий путь класса и добавить к нему заданный аргумент.

Я могу получить имя класса несколько способов: System.getProperty("java.class.path"), new File(".")и getCanonicalPath(), и так далее ...

Проблема в том, что это дает мне только каталог, в котором хранятся пакеты - то есть, если у меня есть класс, хранящийся в " .../project/this/is/package/name", он дал бы мне только " /project/" и игнорировал бы имя пакета, в котором на самом деле .class filesживет.

Какие-либо предложения?

РЕДАКТИРОВАТЬ: вот объяснение, взятое из описания упражнения.

sourcedir может быть абсолютным (начиная с «/») или относительно того, откуда мы запускаем программу.

sourcedir - это заданный аргумент для основного метода. как мне найти этот путь?

Ла бла бла
источник
2
Что вы будете делать, если код упакован в JAR (или не находится в структуре папок / файлов, как вы предполагаете)? Это опасное предположение; это может сработать для небольшого эксперимента, назначения класса или другой одноразовой ситуации, но ПОЖАЛУЙСТА, не входите в привычку делать это предположение для кода производственного качества.
E-Riz
Нет смысла искать путь к файлу класса. Также в описании упражнения не упоминается, что если вы внимательно его прочитаете ( где мы запускаем программу, означает текущий путь, из которого программа вызывается пользователем).
The Nail
Может быть, вы могли бы помочь мне лучше понять требование? Мне нужно проверить, что аргумент начинается с символа '/' (упоминание в описании). если это так, просто используйте его как абсолютное. как есть. но если нет, как мне к этому относиться?
La bla bla

Ответы:

166

Используйте, this.getClass().getCanonicalName()чтобы получить полное имя класса.

Обратите внимание, что имя пакета / класса («abC») отличается от пути к файлам .class (a / b / C.class), и что использование имени пакета / имени класса для получения пути обычно является плохой практикой. Наборы файлов / пакетов классов могут иметь несколько разных путей к классам, которые могут быть каталогами или файлами jar.

Гвоздь
источник
спасибо, но это в основном методе, и 'this' не может использоваться в статических методах. любая работа вокруг этого?
La bla bla
30

Есть класс 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, приведенный выше код напечатал бы:

Пакет: mypackage
Класс: MyClass
Полный идентификатор: mypackage.MyClass

Вы можете взять эту информацию и изменить ее так, как вам нужно, или проверить API для получения дополнительной информации.

Джон Эгеланн
источник
1
Обратите внимание, что Class.forName ("MyClass") будет работать, только если он находится в пакете по умолчанию (т.е. не имеет объявления пакета).
The Nail,
2
@TheNail true, и getName()возвращает имя пакета вместе с именем класса, сейчас редактируем.
Джон Эгеланд,
Используйте, getSimpleName()чтобы получить только имя класса без имени пакета.
The Nail
1
Вместо этого Class.forName("MyClass")вы должны использовать, MyClass.classесли вам действительно не нужно обнаружение времени выполнения по какой-либо другой причине.
mjaggard
12

Полное имя получается следующим образом:

String fqn = YourClass.class.getName();

Но вам нужно прочитать ресурс пути к классам. Так что используйте

InputStream in = YourClass.getResourceAsStream("resource.txt");
Божо
источник
3

использовать this.getClass().getName()для получения packageName.classNameи использовать this.getClass().getSimpleName()для получения только имени класса

Md. Захангир Алам
источник