类型描述符

简介: 类型描述符

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

见:

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

相关文章
|
7月前
|
存储 C语言
文件的类型指针
文件的类型指针
84 0
|
存储 Linux C++
结构体类型的定义和初始化
结构体类型的定义和初始化
|
存储 编译器 C++
32.【C/C++ 结构体全类型 (详解)】(一)
32.【C/C++ 结构体全类型 (详解)】
77 0
|
存储 C++
32.【C/C++ 结构体全类型 (详解)】(二)
32.【C/C++ 结构体全类型 (详解)】
70 0
|
7月前
|
存储 编译器 Linux
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
|
7月前
|
安全
C learning_15 结构体类型的声明、结构体初始化、结构体成员访问、结构体传参
C learning_15 结构体类型的声明、结构体初始化、结构体成员访问、结构体传参
|
7月前
|
C++
C++程序中的结构体类型
C++程序中的结构体类型
75 1
|
7月前
|
存储 数据处理 C语言
自己建立结构体类型
自己建立结构体类型
43 0
|
7月前
|
C++
22结构体类型
22结构体类型
40 0
|
7月前
结构体类型操作
自定义一个结构体类型的变量,其成员包括学号、姓名、年龄、性别,并将其类型声明为student,然后用该类型定义一个stu1的变量,进行赋值操作,并输出其值。
60 1