将包名称转换为路径

时间:2009-12-17 13:59:13

标签: java

我有一个de.xyz.MyClass课程,存储在de/xyz/MyClass.java中。 如何从课程MyClass本身获取此路径?

4 个答案:

答案 0 :(得分:22)

像这样:

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

但请注意,有时候会对类名进行注释(例如,内部类等)。更多here

如果您从一个类的实例开始(可能是其中一个类的方法中的this),您可以通过instance.getClass()获取该类。例如:

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

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

答案 1 :(得分:9)

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

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并不总是如此。文件(如jar示例所示)

我希望你觉得这很有用。

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:2)

尝试

this.getClass().getPackage().getName();