如何在Java中获取当前类名,包括包名?
Posted
技术标签:
【中文标题】如何在Java中获取当前类名,包括包名?【英文标题】:How to get current class name including package name in Java? 【发布时间】:2012-04-01 12:28:33 【问题描述】:我正在做一个项目,一个要求是如果 main 方法的第二个参数以“/
”(对于 linux)开头,它应该将其视为绝对路径(不是问题),但如果它不以“/
”开头,它应该获取类的当前工作路径,并将给定的参数附加到它。
我可以通过几种方式获取类名:System.getProperty("java.class.path")
、new File(".")
和getCanonicalPath()
,等等...
问题是,这只给了我存储包的目录 - 即,如果我有一个存储在“.../project/this/is/package/name
”中的类,它只会给我“/project/
”并忽略包名实际的.class files
生活。
有什么建议吗?
编辑: 这是从练习描述中摘录的解释
sourcedir 可以是绝对的(以“/”开头)或相对于我们运行程序的位置
sourcedir 是 main 方法的给定参数。我怎样才能找到那条路?
【问题讨论】:
如果代码打包在 JAR 中(或者不像您假设的那样在文件夹/文件结构中),您会怎么做?这是一个危险的假设;这可能适用于小型实验、课堂作业或其他一次性情况,但请不要养成对生产质量代码做出这种假设的习惯。 找不到类文件的路径是没有意义的。练习描述也没有提到如果你仔细阅读它(我们从哪里运行程序是指用户调用程序的当前路径)。 也许你可以帮助我更好地理解需求?我需要检查以“/”开头的参数(在描述中提到)。如果是这样,请将其用作绝对值。照原样。但如果不是,我应该如何对待它? 【参考方案1】:使用this.getClass().getCanonicalName()
获取完整的类名。
请注意,包/类名(“abC”)与 .class 文件(a/b/C.class)的路径不同,使用包名/类名派生路径通常是不好的做法。类文件/包集可以在多个不同的类路径中,可以是目录或jar文件。
【讨论】:
谢谢,但它在main方法中,'this'不能用在静态方法中。有什么解决办法吗? ***.com/questions/936684/…【参考方案2】:有一个类,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
您可以获取此信息并根据需要对其进行修改,或转到check the API 了解更多信息。
【讨论】:
请注意,Class.forName("MyClass") 只有在默认包中才有效(即没有包声明)。 @TheNail true,getName()
返回包名和类名,现在编辑。
使用getSimpleName()
只获取类名而不获取包名。
您应该使用MyClass.class
而不是Class.forName("MyClass")
,除非您出于其他原因确实需要运行时发现。【参考方案3】:
完全限定名称的获取方式如下:
String fqn = YourClass.class.getName();
但是您需要读取类路径资源。所以使用
InputStream in = YourClass.getResourceAsStream("resource.txt");
【讨论】:
【参考方案4】:使用this.getClass().getName()
获取packageName.className
并使用this.getClass().getSimpleName()
仅获取类名
【讨论】:
以上是关于如何在Java中获取当前类名,包括包名?的主要内容,如果未能解决你的问题,请参考以下文章