Java类中的规范名称,简单名称和类名称有什么区别?| Java Debug 笔记

197 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

Java类中的规范名称,简单名称和类名称有什么区别?

在Java中,这些之间有什么区别:

Object o1 = ....
o1.getClass().getSimpleName();
o1.getClass().getName();
o1.getClass().getCanonicalName();

我已经多次检查过Javadoc,但这从来不能很好地解释它。我还进行了测试,但没有反映出调用这些方法背后的任何实际含义。

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

如果不确定某件事,请尝试首先编写测试。

我是这样做的:

class ClassNameTest {
    public static void main(final String... arguments) {
        printNamesForClass(
            int.class,
            "int.class (primitive)");
        printNamesForClass(
            String.class,
            "String.class (ordinary class)");
        printNamesForClass(
            java.util.HashMap.SimpleEntry.class,
            "java.util.HashMap.SimpleEntry.class (nested class)");
        printNamesForClass(
            new java.io.Serializable(){}.getClass(),
            "new java.io.Serializable(){}.getClass() (anonymous inner class)");
    }

    private static void printNamesForClass(final Class<?> clazz, final String label) {
        System.out.println(label + ":");
        System.out.println("    getName():          " + clazz.getName());
        System.out.println("    getCanonicalName(): " + clazz.getCanonicalName());
        System.out.println("    getSimpleName():    " + clazz.getSimpleName());
        System.out.println("    getTypeName():      " + clazz.getTypeName()); // added in Java 8
        System.out.println();
    }
}

打印:

int.class (primitive):
    getName():          int
    getCanonicalName(): int
    getSimpleName():    int
    getTypeName():      int

String.class (ordinary class):
    getName():          java.lang.String
    getCanonicalName(): java.lang.String
    getSimpleName():    String
    getTypeName():      java.lang.String

java.util.HashMap.SimpleEntry.class (nested class):
    getName():          java.util.AbstractMap$SimpleEntry
    getCanonicalName(): java.util.AbstractMap.SimpleEntry
    getSimpleName():    SimpleEntry
    getTypeName():      java.util.AbstractMap$SimpleEntry

new java.io.Serializable(){}.getClass() (anonymous inner class):
    getName():          ClassNameTest$1
    getCanonicalName(): null
    getSimpleName():    
    getTypeName():      ClassNameTest$1

最后一个块中有一个空条目,其中getSimpleName返回一个空字符串。

看这个的结果是:

该名称是您愿意使用动态加载与类,例如,调用的名称Class.forName与默认ClassLoader。在一定范围内ClassLoader,所有类均具有唯一的名称。

该规范名称是将在import语句中使用的名称。在执行toString或记录操作时可能很有用。当javac编译器具有类路径的完整视图时,它通过在编译时冲突完全限定的类和程序包名称来在其中强制规范名称的唯一性。但是,JVM必须接受此类名称冲突,因此规范名称不能唯一地标识内的类ClassLoader。(事后看来,该吸气剂的更好称呼是getJavaName;但是该方法可以追溯到JVM仅用于运行Java程序的时间。)

在简单的名字松散标识类,又可能是有用的过程toString或记录的操作,但不能保证是唯一的。 类型名称返回“此类型名称的信息字符串”,“就像toString:它纯粹是信息性的,没有合同价值”。(如sir4ur0n所写)

文章翻译自 yl2gl72eozkinivz3vc6swkesy-ac4c6men2g7xr2a-translate.translate.goog/questions/1…

作者建议:上面解释了基本定义,作者也有使用多,例如在使用反射+注解时,我们需要去扫描那些类或者类上的方法有这个注解,这个时候就需要获取到类的名称。

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️