将包名称转换为路径

roc*_*ker 13 java

我有一个de.xyz.MyClass存储的类de/xyz/MyClass.java.我如何从班级MyClass本身获得这条道路?

T.J*_*der 23

像这样:

String path = MyClass.class.getName().replace(".", "/") + ".java";
Run Code Online (Sandbox Code Playgroud)

但请注意,有时候类名称是注释的(例如,内部类等).更多这里.

如果你从一个类的实例开始(也许this在类的一个方法中),你可以通过它来获取类instance.getClass().例如:

private String getPathToThis() {
    return this.getClass().getName().replace(".", "/") + ".java";
}
Run Code Online (Sandbox Code Playgroud)

当然,这些将与classpath中的某个base(目录或jar)相关...


Osc*_*Ryz 9

我不确定你回答这个问题,所以我会尽力猜测:

package de.xyz;

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

在编译和运行时给出:

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
Run Code Online (Sandbox Code Playgroud)

这样你可以修改一些调用并拥有你想要的路径:

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
Run Code Online (Sandbox Code Playgroud)

请记住,只有在类存储在目录中的情况下,对于jar,你必须稍微修改它(if( pathToClass.startsWith("jar")){ //etc...)

此外,类加载器并不总是与文件系统一起工作,其中一些加载来自数据库,ldaps和几乎任何地方的文件,因此对于de.xyz.MyClass存在de/xyz/MyClass.class 文件并不总是如此(如jar示例所示)

希望这个对你有帮助.


小智 6

有一个util class ==> org.springframework.util.ClassUtils.

ClassUtils.convertClassNameToResourcePath("de.xyz.MyClass");
Run Code Online (Sandbox Code Playgroud)

资料来源:https: //docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/ClassUtils.html

  • 请注意,您提到的类和链接到的文档是不同的类 - 一个是Apache Commons的一部分,另一个是Spring框架的一部分.如果您已经在项目中使用其中一个,那么您可以使用其中一个,但除此之外,它是一个相当重的依赖性来引入一些简单的东西.实际上,您提到的Spring ClassUtils方法的代码基本上是这样的:className.replace(PACKAGE_SEPARATOR,PATH_SEPARATOR). (3认同)

Pet*_*ang 2

尝试

this.getClass().getPackage().getName();
Run Code Online (Sandbox Code Playgroud)

  • 这将打印“de.xyz.MyClass”。所需的输出是“de/xyz/MyClass”。 (4认同)