Я не уверен, что если вы ответите на этот вопрос, я сделаю все возможное, чтобы догадаться:
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
(как показано с примером банку)
Надеюсь, вы найдете это полезным.