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

105
我正在开发一个项目,其中一个要求是如果主方法的第二个参数以“/”(对于Linux)开头,则应将其视为绝对路径(没有问题),但如果它不以“/”开头,则应获取类的当前工作路径并将给定的参数附加到它上面。
我可以通过几种方式获取类名:System.getProperty("java.class.path")new File(".")getCanonicalPath()等等...
问题在于,这只会给我存储包的目录 - 也就是说,如果我有一个存储在“.../project/this/is/package/name”中的类,它只会给我“/project/”,而忽略了实际.class文件所在的包名。
有什么建议吗?
编辑: 以下是从练习说明中摘取的解释
sourcedir可以是绝对路径(以“/”开头)或相对于我们运行程序的位置
sourcedir是主方法的给定参数。如何找到该路径?

2
如果代码被打包成JAR文件(或者不像你所假设的那样以文件夹/文件结构存在),你会怎么做?这是一个危险的假设;对于小实验、课堂作业或其他一次性情况,这可能没问题,但请不要养成在生产质量代码中做出这种假设的习惯。 - E-Riz
没有必要找到类文件的路径。而且练习描述没有提到,如果您仔细阅读(“我们运行程序的位置”表示用户调用程序的当前路径)。 - The Nail
也许你能帮我更好地理解需求吗?我需要检查参数是否以“/”开头(在描述中提到)。如果是,则按原样将其用作绝对路径。但是如果不是,我应该如何处理它? - La bla bla
4个回答

196

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

请注意,包/类名(“a.b.C”)与.class文件的路径(a/b/C.class)不同,并且使用包名/类名来推导路径通常是不好的做法。一组类文件/包可以在多个不同的类路径中,这些路径可以是目录或jar文件。


谢谢,但它在主方法中,并且'this'不能在静态方法中使用。有什么解决办法吗? - La bla bla
1
https://dev59.com/6HNA5IYBdhLWcg3wgeAd - The Nail

34

有一个名为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 代表包 mypackage 中的类 MyClass,则上述代码将打印出:

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

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

1
请注意,只有当Class.forName("MyClass")在默认包中(即没有包声明)时才能正常工作。 - The Nail
2
@TheNail 是正确的,而 getName() 返回包名和类名,正在进行编辑。 - Jon Egeland
使用 getSimpleName() 方法可以获取类名而不包括包名。 - The Nail
1
你应该使用 MyClass.class 而不是 Class.forName("MyClass"),除非你真的需要运行时发现其他原因。 - mjaggard

15

完整限定名的获取方法如下:

String fqn = YourClass.class.getName();

但是您需要读取类路径资源。因此,请使用

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

8

使用this.getClass().getName()获取packageName.className,使用this.getClass().getSimpleName()仅获取类名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接