преобразовать имя пакета в путь - PullRequest
13 голосов
/ 17 декабря 2009

У меня есть класс de.xyz.MyClass, который хранится в de/xyz/MyClass.java. Как я могу получить этот путь от самого класса MyClass?

Ответы [ 4 ]

23 голосов
/ 17 декабря 2009

Как это:

String path = MyClass.class.getName().replace(".", "/") + ".java";

Но обратите внимание, что иногда имена классов аннотируются (например, внутренние классы и т. Д.). Подробнее здесь .

Если вы начинаете с экземпляра класса (возможно, this внутри одного из методов класса), вы можете получить класс через instance.getClass(). Например:

private String getPathToThis() {
    return this.getClass().getName().replace(".", "/") + ".java";
}

Конечно, они будут относиться к некоторой базе (директории или jar) в пути к классам ...

9 голосов
/ 17 декабря 2009

Я не уверен, что если вы ответите на этот вопрос, я сделаю все возможное, чтобы догадаться:

package de.xyz;

class PathForClass {
    public static void main( String [] args ) {
        System.out.println( 
            PathForClass.class.getResource( "PathForClass.class" ) 
        );
    }
}

Что при компиляции и запуске дает:

C:\Users\Oscar\code>javac -d . PathForClass.java

C:\Users\Oscar\code>java -cp . de.xyz.PathForClass
file:/C:/Users/Oscar/code/de/xyz/PathForClass.class

Таким образом, вы можете немного изменить вызовы и иметь желаемый путь:

package de.xyz;

class PathForClass {
    public static void main( String [] args ) {
        String currentDir  = new java.io.File(".").toURI().toString();
        String pathToClass = PathForClass.class.getResource( "PathForClass.class" ).toString();
        System.out.println( pathToClass.substring( currentDir.length() - 2  )); // -2 to get rid of the /./ at the end of the current dir
    }
}

C:\Users\Oscar\code>java -cp . de.xyz.PathForClass
de/xyz/PathForClass.class

Имейте в виду, что это будет работать только там, где классы хранятся в каталогах, для jar-файлов вам придется его немного изменить (if( pathToClass.startsWith("jar")){ //etc...)

Кроме того, загрузчики классов не всегда работают с файловой системой, некоторые из них загружают файлы из баз данных, ldaps и почти везде, поэтому не всегда верно, что для de.xyz.MyClass существует файл de/xyz/MyClass.class (как показано с примером банку)

Надеюсь, вы найдете это полезным.

6 голосов
/ 25 ноября 2014

Существует класс утилит ==> org.springframework.util.ClassUtils.

ClassUtils.convertClassNameToResourcePath("de.xyz.MyClass");

Источник: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/ClassUtils.html

2 голосов
/ 17 декабря 2009

Попробуйте

this.getClass().getPackage().getName();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...