我正在开发一个项目,一个要求是如果主方法的第二个参数以“
/
”(对于linux)开头,它应该将其视为绝对路径(不是问题),但如果不是以“/
”开头,它应该获取类的当前工作路径,并向其附加给定的参数。
我可以通过多种方式获取类名:
System.getProperty("java.class.path")
、new File(".")
和getCanonicalPath()
等等...
问题是,这只会给我存储包的目录 - 即,如果我有一个类存储在“
.../project/this/is/package/name
”中,它只会给我“/project/
”并忽略实际包名称.class files
还活着。
有什么建议吗?
编辑: 这是摘自练习描述的解释
sourcedir 可以是绝对的(以“/”开头)或相对于我们运行程序的位置
sourcedir 是 main 方法的给定参数。我怎样才能找到那条路?
使用
this.getClass().getCanonicalName()
获取完整的班级名称。
请注意,包/类名称(“a.b.C”)与 .class 文件的路径(a/b/C.class)不同,并且使用包名称/类名称来派生路径通常是不好的做法。类文件/包集可以位于多个不同的类路径中,可以是目录或 jar 文件。
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
您可以获取此信息并根据需要进行修改,或者前往检查 API 了解更多信息。
完全限定名称的获取方式如下:
String fqn = YourClass.class.getName();
但是你需要读取类路径资源。所以使用
InputStream in = YourClass.getResourceAsStream("resource.txt");
使用
this.getClass().getName()
获取 packageName.className
并使用 this.getClass().getSimpleName()
仅获取类名
从 Java9 开始,这个问题的答案是:Clazz.class.getPackage()
package com.demo;
public class ExampleClass {
public static void main(String[] args) {
Package package = ExampleClass.class.getPackage();
if (package != null) {
System.out.println("Package name: " + package.getName());
} else {
System.out.println("This class is not in a package.");
}
}
}
输出:
Package name: com.demo