我知道你愚蠢轻佻、头脑空虚,然而我爱你;我知道你的企图你的理想,你的势力,你的庸俗,然而我爱你;我知道你是个二流货色,然而我爱你。——毛姆
见:
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
然后方法描述符的规则是:
(参数描述符们)返回值描述符
例如:
这样一个方法:
1 | |
它的描述符为
1 | |
而我们的java.io.PrintStream#println(java.lang.Object)也就是我们常用的System.io.println(obj)
1 | |
描述符为
1 | |
java.lang.Integer#compare——public static int compare(int x, int y) {..}的描述符为(II)I
我这里根据规则编写了一个获取方法描述符的方法:
放到了hutool 6.x的ReflectUtil.getDescriptor