在面向对象的世界,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的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

你真的了解java class name吗?的更多相关文章

  1. 你真的理解Java 注解吗?

    你真的理解Java 注解吗? 1.什么是注解? 官方解释: Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java ...

  2. 你真的了解java的lambda吗?- java lambda用法与源码分析

    你真的了解java的lambda吗?- java lambda用法与源码分析 转载请注明来源:cmlanche.com 用法 示例:最普遍的一个例子,执行一个线程 new Thread(() -> ...

  3. 15个问题自查你真的了解java编译优化吗?

    摘要:为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了. 本文分享自华为云社区<你真的了解java编译优化吗?15个问题 ...

  4. Java随谈(六)## 我们真的理解 Java 里的整型吗?

    我们真的理解 Java 里的整型吗 整型是我们日常生活中最常用到的基础数据类型,看这篇文章之前,我想问: 我们真的像自己认为的那么理解 Java 内的整型吗? 也许看完本篇文章你就有自己的答案. C ...

  5. 你真的理解Java的按引用传递吗?

    首先我们来看下面这段代码: public class Test1 { String a = "123"; public static void change(Test1 test) ...

  6. 你真的精通Java吗?

    简历和自我介绍上经常能够读到“精通Java”这样的话,有人和我说,精通Java的人太多了,精通Java已经不能算亮点.不能给自己加分了.可是事实真是这样吗? 对于语言的学习,我有一种观点,一是纵向,即 ...

  7. 你真的理解Java的this和super吗?

    你不知道的this 很多介绍java的书籍都说this指该对象本身.我们来看下面代码: class Base{ private int i = 3; public Base() { this.disp ...

  8. 你真的了解JAVA中与Webservice相关的规范和实现吗?

    非常多人在项目中使用Webservice,仅仅是知道怎样公布Webservice,怎样调用Webservice,但真要论其来龙去脉,还真不一定清楚. 一切一切还要从我们伟大的sun公司规范说起. JA ...

  9. Java系列2 --- 你真的知道Java的String对象么?

    ​在上一篇中说道这篇文章会说java的动态绑定机制,由于这个知识点放在继承中讲会比较合适,说以在这篇文章中先来详细的说说String对象吧. ​只要学过Java的同学,我们都知道Java一共有8中基本 ...

  10. Java内存管理-你真的理解Java中的数据类型吗(十)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 作为Java程序员,Java 的数据类型这个是一定要知道的! 但是不管是那种数据类型最 ...

随机推荐

  1. mysql日期范围查找(两个日期之间的记录)

    转自:https://blog.csdn.net/lzxlfly/article/details/97577575?utm_medium=distribute.pc_relevant_t0.none- ...

  2. django学习第十二天--ajax请求和csrftoken认证的三种方式

    基于cookie的登录认证装饰器 def check_login(f): def inner(request,*args,**kwargs): is_login = request.COOKIES.g ...

  3. @staticmethod/@classmethod/实例方法/@abstractmethod

    from abc import ABCMeta, abstractmethod # 定义一个抽象类 class Person(metaclass=ABCMeta): name = "泰山&q ...

  4. Java新建一个子线程异步运行方法

    如何在运行主方法的同时异步运行另一个方法,我是用来更新缓存: 1. 工具类 public class ThreadPoolUtils { private static final Logger LOG ...

  5. 好用网址分享-77ai导航与77搜索导航

    AI(人工智能)技术正在改变我们的生活方式和工作方式,越来越多的人开始关注和使用AI相关的网站和应用程序.在这篇文章中,我将为大家介绍一些常用的AI网址导航,帮助您更好地了解和使用AI技术. AI H ...

  6. C++ //栈 stack 容器 先进后出 不允许遍历

    1 //栈 stack 容器 先进后出 不允许遍历 2 3 4 #include<iostream> 5 #include<stack> 6 7 using namespace ...

  7. GPT Prompt

    GPT Prompt 本文总结我关于GPT prompt的一些常用模板和资源. 我常用的模板 大致模板:你是一个怎样的人,我的场景是什么,我想要什么,你需要做什么. 比如: 你是一个经验丰富的前端开发 ...

  8. (广州南沙)vue知识点整理2021,主要是防止忘记防备快速翻看

         ///////////////////////////   vue 中使用路由技巧:router //////////////////////////////// 写笔记说明,之前在江门工作 ...

  9. Error running 'Tomcat 8.5.27': Unable to open debugger port (127.0.0.1:2887): java.net.SocketException "Interrupted function call: accept failed"-火绒安全搞的鬼

    火绒安全-导致的tomcat8启动异常 一.问题由来 最近有个朋友在学习使用IDEA配置tomcat 8.5.99的时候,使用一切都正常,直到学习到使用Servlet实现文件 下载功能的时候,出现问题 ...

  10. C#实现FTP服务端和客户端

    目录 简介 FTP客户端 系统客户端 客户端软件 自定义客户端 FTP服务端 系统服务端 服务端软件 自定义服务端 附件 简介 FTP是FileTransferProtocol(文件传输协议)的英文简 ...