类型描述符

简介: 类型描述符

我知道你愚蠢轻佻、头脑空虚,然而我爱你;我知道你的企图你的理想,你的势力,你的庸俗,然而我爱你;我知道你是个二流货色,然而我爱你。——毛姆

见:

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.2.1

java中,由于历史原因,出现在类文件结构中的二进制名称语法与我们常用的类名不同,通常使用(正斜杠)/替换了原本的包名间隔(句号).

例如Thread的类名叫java.lang.Thread,但是在class文件格式的描述符中使用的内部格式,对Thread类名称utf8的引用却是:java/lang/Thread

不信我们随便打开一个class文件

可以看到类似的描述符

那如何获取类的描述符呢?它的规则又是如何呢?

首先,基本类型描述符,都是以ASCII字符表示,例如L 正斜杠类名;表示对象类型,[表示数组类型

我们可以在sun.invoke.util.Wrapper下看到对应枚举常量

例如:

  • int的描述符为I
  • Integer的描述符为Ljava/lang/Integer;
  • void的描述符为V
  • java.lang.Void的描述符为Ljava/lang/Void;
  • Object的描述符为Ljava/lang/Object;
  • double d[][][]的描述符为[[[D

然后方法描述符的规则是:

(参数描述符们)返回值描述符

例如:

这样一个方法:

Object m(int i, double d, Thread t) {..}

它的描述符为

(IDLjava/lang/Thread;)Ljava/lang/Object;

而我们的java.io.PrintStream#println(java.lang.Object)也就是我们常用的System.io.println(obj)

public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}

描述符为

(Ljava/lang/Object;)V

java.lang.Integer#compare——public static int compare(int x, int y) {..}的描述符为(II)I

我这里根据规则编写了一个获取方法描述符的方法:

https://gitee.com/dromara/hutool/blob/v6-dev/hutool-core/src/main/java/cn/hutool/core/reflect/ReflectUtil.java

放到了hutool 6.xReflectUtil.getDescriptor

相关文章
|
JSON 前端开发 Java
❤️最后的大爆发❤️五万字总结SpringMVC教程——三部曲封神之作(建议收藏)
❤️最后的大爆发❤️五万字总结SpringMVC教程——三部曲封神之作(建议收藏)
383 0
❤️最后的大爆发❤️五万字总结SpringMVC教程——三部曲封神之作(建议收藏)
|
缓存 Dart JavaScript
flutter版本控制工具 `FVM`
文章目录 FVM 切换VSCode 的Flutter版本 在windows上安装fvm 方法一:先安装 choco 检查安装是否成功 常用指令 接下来安装fvm 方法二:pub方式安装 fvm VSCode配置 安卓studio Flutter版本切换 项目 缓存目录 列出配置 设置缓存路径 配置 常用命令 安装 删除 列出 releases doctor 路由 配置全局版本 项目多个选项 针对不用flavor版本 切换flavor版本 查看flavor 常见问题 运行 FVM 时内核二进制文件无效或 sdk 哈希无效 PATH 中 Windows 的环境变量顺序 找不到命令“pub”
1289 1
flutter版本控制工具 `FVM`
|
SQL 存储 监控
水滴筹基于阿里云 EMR StarRocks 实战分享
水滴筹大数据部门的数据开发工程师韩园园老师为大家分享水滴筹基于阿里云EMR StarRocks的实战经验。
6713 3
水滴筹基于阿里云 EMR StarRocks 实战分享
|
存储 缓存 API
Google Pay支付遇到的问题(上)
Google Pay 无法购买您要的商品 [DF-AA-01] [DF-AA-20] 支付失败、无法支付、购买无效 弹窗提示:我们这边除了点错误,请重试。 支付返回CODE(BillingResponseCode) 无法用于此购买交易 检查付款是否通过 使用 Play 商店应用 使用网络浏览器: 重启设备 更新 Play 商店应用 确保日期和时间正确 如果“自动日期和时间”和“自动时区”关闭 如果打开“自动日期和时间”和“自动时区”
5215 0
Google Pay支付遇到的问题(上)
|
存储 NoSQL MongoDB
mongdb如何查询数据库表的创建时间
【5月更文挑战第22天】mongdb如何查询数据库表的创建时间
425 4
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
770 1
|
并行计算 安全 数据处理
函数式编程和面向对象编程有什么区别?
【10月更文挑战第12天】 函数式编程与面向对象编程是两种不同的编程范式。前者强调数学函数的求值、不可变数据和纯函数,后者则以对象为核心,封装数据和方法。函数式编程更关注数据转换和计算过程,而面向对象编程关注对象的定义和交互。两者在数据处理、函数角色、代码结构、并发处理、灵活性和适用场景等方面存在显著差异。在实际开发中,可以根据需求选择合适的编程范式或结合使用。
857 4
|
并行计算 算法 量子技术
量子计算与材料科学:加速新材料研发进程
【9月更文挑战第24天】量子计算与材料科学的深度融合,正在开启一个全新的科研时代。通过利用量子计算技术的优势,我们可以更加高效地模拟和预测材料的性能,加速新材料的研发进程。这不仅有助于推动材料科学的进步,还将为工业、能源、环保等领域带来革命性的变革。让我们共同期待量子计算技术在材料科学领域的辉煌未来!
|
开发工具 git Windows
解决git clone提示You hasn‘t joined this enterprise
解决git clone提示You hasn‘t joined this enterprise
1369 2
|
Dart Android开发 Windows
Flutter和Native 通信 android端
Flutter和Native 通信 android端