你真的了解java class name吗?

简介: 你真的了解java class name吗?

在面向对象的世界,Class是java的基础。java.lang.Class实际上是继承自java.lang.Object。


class有一个方法叫做getName,该方法会返回(class, interface, array class, primitive type,或者 void)的Class名字。


如果你经常调试JVM的话,会看到下面这样奇怪的内容:


jcmd 1234 GC.class_histogram


image.png


这些奇怪的内容都是class name,下面我们就来看看他们都表示什么含义。

class name其实分为三类。


primitive类型或者void


如果类对象是primitive类型或者void,那么他们的class name就是相对应的关键词或者void。


//primary class
        log.info(int.class.getName());
        log.info(short.class.getName());
        log.info(float.class.getName());
        log.info(double.class.getName());
        log.info(long.class.getName());
        log.info(byte.class.getName());
        log.info(char.class.getName());
        log.info(boolean.class.getName());
        //void
        log.info(void.class.getName());


输出结果:


[main] INFO com.flydean.classname.ClassNameUsage - int
[main] INFO com.flydean.classname.ClassNameUsage - short
[main] INFO com.flydean.classname.ClassNameUsage - float
[main] INFO com.flydean.classname.ClassNameUsage - double
[main] INFO com.flydean.classname.ClassNameUsage - long
[main] INFO com.flydean.classname.ClassNameUsage - byte
[main] INFO com.flydean.classname.ClassNameUsage - char
[main] INFO com.flydean.classname.ClassNameUsage - boolean
[main] INFO com.flydean.classname.ClassNameUsage - void


引用类型


如果是引用类型,则会返回该类的class名字:


//object class
        log.info(Object.class.getName());


输出结果:


[main] INFO com.flydean.classname.ClassNameUsage - java.lang.Object


Array类型


Array类型就有点复杂,根据Array的层级关系,会在class name之前添加[,有多少级Array就添加多少个


同时相应的类型会转换为相应的编码:


元素类型 编码
boolean Z
byte B
char C
class or interface Lclassname;
double D
float F
int I
long J
short S


我们举个例子:


//Array
        log.info(int[].class.getName());
        log.info(short[].class.getName());
        log.info(float[].class.getName());
        log.info(double[].class.getName());
        log.info(long[].class.getName());
        log.info(byte[].class.getName());
        log.info(char[].class.getName());
        log.info(boolean[].class.getName());
        log.info(Object[].class.getName());
        //multiple arrays
        log.info(int[][][].class.getName());


输出结果:


[main] INFO com.flydean.classname.ClassNameUsage - [I
[main] INFO com.flydean.classname.ClassNameUsage - [S
[main] INFO com.flydean.classname.ClassNameUsage - [F
[main] INFO com.flydean.classname.ClassNameUsage - [D
[main] INFO com.flydean.classname.ClassNameUsage - [J
[main] INFO com.flydean.classname.ClassNameUsage - [B
[main] INFO com.flydean.classname.ClassNameUsage - [C
[main] INFO com.flydean.classname.ClassNameUsage - [Z
[main] INFO com.flydean.classname.ClassNameUsage - [Ljava.lang.Object;
[main] INFO com.flydean.classname.ClassNameUsage - [[[I


总结


好了,上面的jcmd的输出结果是不是可以理解了?


本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

相关文章
|
10天前
|
Java
java基础(4)public class 和class的区别及注意事项
本文讲解了Java中`public class`与`class`的区别和注意事项。一个Java源文件中只能有一个`public class`,并且`public class`的类名必须与文件名相同。此外,可以有多个非`public`类。每个类都可以包含一个`main`方法,作为程序的入口点。文章还强调了编译Java文件生成`.class`文件的过程,以及如何使用`java`命令运行编译后的类。
15 3
java基础(4)public class 和class的区别及注意事项
|
9天前
|
Java
java的class类
java的class类
18 5
|
2月前
|
Java 测试技术 Docker
记录一次很坑的报错:java.lang.Exception: The class is not public.
这篇文章记录了作者在Docker中运行服务进行单元测试时遇到的一系列问题,包括Spring Boot与Spring Cloud版本不一致、Bean注入问题、测试单元引入问题以及公共类和方法的可见性问题,并提供了解决问题的方法和成功测试通过的代码示例。
记录一次很坑的报错:java.lang.Exception: The class is not public.
|
2月前
|
Java
JAVA中public class和class的区别
JAVA中public class和class的区别
34 7
|
2月前
|
Java 开发工具 Spring
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
|
2月前
|
Oracle Java 关系型数据库
简单记录在Linux上安装JDK环境的步骤,以及解决运行Java程序时出现Error Could not find or load main class XXX问题
本文记录了在Linux系统上安装JDK环境的步骤,并提供了解决运行Java程序时出现的"Error Could not find or load main class XXX"问题的方案,主要是通过重新配置和刷新JDK环境变量来解决。
77 0
|
3月前
|
Java
Error:Internal error: (java.lang.IllegalAccessError) class com.,idea2019.3版本,必须用application2.7.6或者以下
Error:Internal error: (java.lang.IllegalAccessError) class com.,idea2019.3版本,必须用application2.7.6或者以下
|
4月前
|
存储 SQL 关系型数据库
【BUG记录】Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xA6' for column 'name' at row 1
在MySQL中遇到`Incorrect string value`错误通常是因为尝试插入的字符串包含不被数据库字符集支持的字符,如表情符号。错误根源是MySQL默认的utf8不支持4字节的UTF-8字符(如Emoji)。
141 1
|
4月前
|
前端开发 Java
java加载class文件的原理
java加载class文件的原理
|
4月前
|
前端开发 JavaScript Java
Java基础10-深入理解Class类和Object类(二)
Java基础10-深入理解Class类和Object类(二)
43 5
下一篇
无影云桌面