Як отримати назву поточного класу, включаючи назву пакета в Java?


82

Я працюю над проектом, і одна вимога полягає в тому, що якщо другий аргумент основного методу починається з “ /” (для Linux), він повинен розглядати його як абсолютний шлях (не проблема), але якщо він починається не з “ /”, Він повинен отримати поточний робочий шлях класу і додати до нього заданий аргумент.

Я можу отримати ім'я класу кілька способів: System.getProperty("java.class.path"), new File(".")і getCanonicalPath(), і так далі ...

Проблема полягає в тому, що це дає мені лише каталог, в якому зберігаються пакунки - тобто якщо у мене є клас, що зберігається в " .../project/this/is/package/name", це дасть мені лише " /project/" і ігнорує ім'я пакету, де фактично .class filesживе.

Будь-які пропозиції?

EDIT: Ось пояснення, взяте з опису вправи

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()для отримання лише назви класу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.