字节码方法签名长啥样
你在反编译 Java class 文件时,是不是经常看到一堆像咒语一样的字符?比如 Ljava/lang/String;[I)V 这种。别慌,这就是字节码里的方法签名,虽然看起来怪,但其实有规律可循。
方法签名的结构拆解
一个完整的方法签名在字节码里是这样表示的:(参数类型)返回值类型。括号里面是参数列表,按顺序写;括号外是返回类型。没有返回值就是 V,对应 void。
比如这个签名:(Ljava/lang/String;I)V,它代表的是:接受一个字符串和一个整数,没有返回值的方法。
基本类型的缩写
Java 基本类型在字节码里都有单字母代号:
- I → int
- Z → boolean
- B → byte
- S → short
- J → long
- F → float
- D → double
- C → char
- V → void(仅用于返回值)
对象和数组怎么表示
对象类型以 L 开头,类名用 / 分隔,最后以 ; 结尾。比如:
Ljava/lang/String;
这表示 java.lang.String 类型。
数组用 [ 表示,每多一维就多一个 [。比如:
[I // int[]
[[Ljava/lang/Object; // Object[][]
举个实际例子
假设你有这样一个方法:
public static void printInfo(String name, int age, String[] hobbies)
它对应的字节码方法签名就是:
(Ljava/lang/String;I[Ljava/lang/String;)V
从左到右依次是:String 参数、int 参数、String 数组参数,返回 V 表示 void。
在哪能看到这些签名
你可以用 javap 命令查看 class 文件的字节码信息。比如:
javap -s YourClass.class
加上 -s 参数后,输出里就会显示每个方法的签名。在调试混淆代码、分析第三方库或者做字节码增强时,这个技能特别实用。
下次再看到那一串奇怪字符,别懵,拆开看看,其实它只是在老老实实告诉你:这方法要啥,又回啥。