91

我正在做一个项目,一个要求是如果 main 方法的第二个参数以“<code>/”(对于 linux)开头,它应该将其视为绝对路径(不是问题),但如果不是t 以“<code>/”开头,它应该获取类的当前工作路径并附加给定的参数。

我可以通过多种方式获取类名:System.getProperty("java.class.path"),new File(".")getCanonicalPath(), 等等...

问题是,这只给了我存储包的目录——即,如果我有一个存储在“ .../project/this/is/package/name”中的类,它只会给我“ /project/”并忽略实际.class files存在的包名称。

有什么建议么?

编辑:这是来自练习描述的解释

sourcedir 可以是绝对的(以“/”开头)或相对于我们运行程序的位置

sourcedir 是 main 方法的给定参数。我怎样才能找到那条路?

4

4 回答 4

182

用于this.getClass().getCanonicalName()获取完整的类名。

请注意,包/类名 ("abC") 与 .class 文件 (a/b/C.class) 的路径不同,并且使用包名/类名来派生路径通常是不好的做法。类文件/包集可以位于多个不同的类路径中,可以是目录或 jar 文件。

于 2012-03-15T22:39:33.103 回答
32

有一个类,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
完整标识符:mypackage.MyClass

您可以获取此信息并根据需要对其进行修改,或者查看 API以获取更多信息。

于 2012-03-15T22:43:33.850 回答
14

完全限定名称的选择如下:

String fqn = YourClass.class.getName();

但是您需要阅读类路径资源。所以使用

InputStream in = YourClass.getResourceAsStream("resource.txt");
于 2012-03-15T22:47:46.883 回答
4

用于this.getClass().getName()获取packageName.className和用于this.getClass().getSimpleName()仅获取类名

于 2018-11-06T12:04:26.310 回答