你真的了解java class name吗?
2023-04-18 13:03:52 时间
在面向对象的世界,Class是java的基础。java.lang.Class实际上是继承自java.lang.Object。
class有一个方法叫做getName,该方法会返回(class, interface, array class, primitive type,或者 void)的Class名字。
如果你经常调试JVM的话,会看到下面这样奇怪的内容:
jcmd 1234 GC.class_histogram
这些奇怪的内容都是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
本文作者:flydean程序那些事
本文链接:http://www.flydean.com/java-class-name/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
相关文章
- 聚合登录系统
- BPMN工作流的基本概念!详解工作流框架Activiti的服务架构和组件
- 2021-12-01:给定一个正数数组arr,代表每个人的体重。给
- 怎么挂维护盘到开机启动项
- 谷歌AI一次注释了10%的已知蛋白质序列,超过人类十年研究成果
- linux重要目录之usr和var
- Echo 框架:启动多个端口
- 程序员做饭指南霸榜GitHub,还用数学公式解决“吃什么”难题
- 搞定大厂算法面试之leetcode精讲15.链表
- 微盛·企微管家再获3亿元融资,继续领跑企业微信SCRM赛道
- 搞定大厂算法面试之leetcode精讲16.set&map
- 千万级流量的大型分布式系统架构设计
- 大数据ELK(十四):Elasticsearch编程(基本操作)
- 爬虫实战二:抓取小红书图片
- 2022 年的十种软件开发趋势
- 忘记了已保存自动登录的密码,怎么办?
- 翻译翻译,什么叫类与对象!
- 陈丹琦组掩蔽语言模型研究:15%掩蔽率不是最佳,40%站得住脚吗?
- 【算法千题案例】每日LeetCode打卡——88. 验证回文字符串 Ⅱ
- 翻译翻译,什么叫继承!