查看原文
其他

高级 | Java中获取类名的3种方法!

R哥 Java技术栈 2018-08-06


Java技术栈

不可错过的 Java 技术公众号

 


获取类名的方法

Java 中获取类名的方式主要有以下三种。

  • getName()

返回的是虚拟机里面的class的类名表现形式。

  • getCanonicalName()

返回的是更容易理解的类名表示。

  • getSimpleName()

返回的是类的简称。

都有什么区别?

通过一个实例来看下它们主要的区别。

  1. public class TestClass {

  2.    public static void main(String[] args) {

  3.        // 外部普通类

  4.        System.out.println("方法名             类名");

  5.        System.out.println("getName            " + TestClass.class.getName());

  6.        System.out.println("getCanonicalName   " + TestClass.class.getCanonicalName());

  7.        System.out.println("getSimpleName      " + TestClass.class.getSimpleName());

  8.        System.out.println();

  9.        // 内部类

  10.        System.out.println("getName            " + TestInnerClass.class.getName());

  11.        System.out.println("getCanonicalName   " + TestInnerClass.class.getCanonicalName());

  12.        System.out.println("getSimpleName      " + TestInnerClass.class.getSimpleName());

  13.        System.out.println();

  14.        // 数组类

  15.        TestInnerClass[] testInnerClasses = new TestInnerClass[]{

  16.                new TestInnerClass(),

  17.                new TestInnerClass(),

  18.                new TestInnerClass()

  19.        };

  20.        System.out.println("getName            " + testInnerClasses.getClass().getName());

  21.        System.out.println("getCanonicalName   " + testInnerClasses.getClass().getCanonicalName());

  22.        System.out.println("getSimpleName      " + testInnerClasses.getClass().getSimpleName());

  23.        System.out.println();

  24.    }

  25.    static class TestInnerClass {

  26.    }

  27. }

程序输出以下结果。

  1. 方法名              类名

  2. getName            com.test.TestClass

  3. getCanonicalName   com.test.TestClass

  4. getSimpleName      TestClass

  5. getName            com.test.TestClass$TestInnerClass

  6. getCanonicalName   com.test.TestClass.TestInnerClass

  7. getSimpleName      TestInnerClass

  8. getName            [Lcom.test.TestClass$TestInnerClass;

  9. getCanonicalName   com.test.TestClass.TestInnerClass[]

  10. getSimpleName      TestInnerClass[]

[Lcom.test.TestClass$TestInnerClass;值得说明一下。

这是一种对函数返回值和参数的编码,叫做JNI字段描述符(JavaNative Interface FieldDescriptors)。

[ 表示数组,一个代表一维数组,比如 [[ 代表二维数组。之后 L 代表类描述符,最后 ;表示类名结束。

结论

1、从以上结果可以看出 getName() 和 getCanonicalName() 在获取普通类名的时候没有区别,在获取内部类和数组类有区别的。

2、getSimpleName() 在获取普通类和内部类名的时候没区别,在获取数组类的时候有区别。


觉得有用就转发分享一下吧


往期推荐

 

【1】高级 Java 面试通关知识点整理!

【2】Spring Boot & Cloud 最强教程

【3】12 个非常有用的 Git 使用技巧!

【4】到底什么是跨域?附解决方案!

【5】图解分布式架构的演进!

点击阅读原文,更多技术干货!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存