如何在Java中获取当前的类名,包括包名?


82

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

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

问题是,这仅给我提供了存储软件包的目录-即,如果我在“ .../project/this/is/package/name”中存储了一个类,则只会给我“ /project/”,而忽略了实际.class files存在的软件包名称。

有什么建议么?

编辑:这是从练习说明中得到的解释

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

sourcedir是main方法的给定参数。我如何找到那条路?


2
如果代码打包在JAR中(或者不在您假设的文件夹/文件结构中),您将怎么办?这是一个危险的假设。这对于小规模的实验,班级分配或其他一次性情况可能会很好,但是请不要养成对生产质量代码进行这种假设的习惯。
E-Riz 2012年

查找类文件的路径没有任何意义。另外,练习描述中没有提到如果您仔细阅读它(我们从中运行程序的位置表示用户从中调用程序的当前路径)。
The Nail 2012年

也许您可以帮助我更好地了解要求?我需要检查以'/'开头的参数(描述中的提及)。如果确实如此,则将其用作绝对值。照原样。但是,如果没有,我应该如何对待呢?
La bla bla 2012年

Answers:


166

使用this.getClass().getCanonicalName()来获得完整的类名。

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


谢谢,但是它在main方法中,而'this'不能在静态方法中使用。有任何解决方法吗?
La bla bla 2012年


30

有一个类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表示该类,则上面的代码将打印:MyClassmypackage

软件包:mypackage
类:MyClass
完整标识符:mypackage.MyClass

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


1
请注意,Class.forName(“ MyClass”)仅在默认包中(即没有包声明)时才起作用。
The Nail

2
@TheNail为true,并getName()返回包名称和类名称,立即进行编辑。
乔恩·埃格兰

用于getSimpleName()仅获取类名,而不获取包名。
The Nail 2012年

1
相反的Class.forName("MyClass"),你应该使用MyClass.class,除非你真的需要一些其他的原因,运行时发现。
mjaggard 2015年

12

可以使用以下全限定名称:

String fqn = YourClass.class.getName();

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

InputStream in = YourClass.getResourceAsStream("resource.txt");

3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.