2012-03-15 6 views
56

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

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

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

Любые предложения?

EDIT: Вот объяснение, взятый из описания упражнений

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

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

+2

Что вы будете делать, если код упакован в JAR (иначе он не находится в структуре папки/файла, как вы предполагаете)? Это опасное предположение; это может сработать для небольшого эксперимента, присвоения класса или другой ситуации с возможностью одноразового использования, но ПОЖАЛУЙСТА, не привыкните делать это предположение для кода производственного качества. –

+0

Нет смысла искать путь к файлу класса.Также в описании упражнения не упоминается, что если вы внимательно его прочитаете (*, где мы запускаем программу из *, означает текущий путь, из которого программа вызывается пользователем). –

+0

Возможно, вы могли бы помочь мне лучше понять это требование? Мне нужно проверить, что аргумент начинается с '/' (упоминание в описании). если это так, просто используйте его как абсолютное. как есть. но если это не так, как мне его лечить? –

ответ

112

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

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

+0

спасибо, но он находится в основном методе, а «this» не может использоваться в статических методах. любая работа вокруг него? –

+0

http://stackoverflow.com/questions/936684/getting-the-class-name-from-a-static-method-in-java –

+0

отредактировал вопрос. чтобы лучше объяснить –

16

Существует класс, 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

Вы можете воспользоваться этой информацией и изменить ее для всего, что вам нужно, или поехать check the API для получения дополнительной информации.

+0

Обратите внимание, что Class.forName («MyClass») будет работать только в том случае, если он находится в пакете по умолчанию (то есть не имеет объявления пакета). –

+1

@TheNail true, а 'getName()' возвращает имя пакета вместе с именем класса, теперь редактируя. – Jon

+0

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

6

Полностью квалифицированное имя opbtained следующим образом:

String fqn = YourClass.class.getName(); 

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

InputStream in = YourClass.getResourceAsStream("resource.txt"); 
Смежные вопросы