在上一篇文章中 jvm之字节码解读——认识字节码文件结构解析(常量池),可能会有人对常量池里面的一些内容有疑问,例如
#1 = Methodref #4.#20 // java/lang/Object."<init>":()V
这里的"()V"表示的是什么意思呢?
其实,这东西我们叫做JNI字段描述符,这里"()V"表示的是“没有入参并且返回参数为void”的方法。
要搞清楚这个,我们得从头捋起
我们先来看java定义方法是怎么定义的,最基础的,你是不是要知道入参、返回参数和方法名(先不考虑访问权限和其他描述符)?例如
public void test(int a,Integer b,String c,boolean d,String[] e) {
}
在字节码领域,各种类型都有另一种表达方式
Java 类型 | 符号 |
boolean | Z |
byte | B |
char | C |
short | S |
int | I |
long | J |
float | F |
double | D |
void | V |
objects对象 | 以"L"开头,以";"结尾,中间是用"/" 隔开的包及类名。比如:Ljava/lang/String;如果是嵌套类,则用$来表示嵌套。例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z" |
另外数组类型的简写,则用"["加上如表A所示的对应类型的简写形式进行表示就可以了,比如:[I 表示 int [],[L/java/lang/objects;表示Objects[],另外。引用类型(除基本类型的数组外)的标示最后都有个";"
例如,我们上面这个例子,在字节码里就描述成:
(ILjava/lang/Integer;Ljava/lang/String;Z[Ljava/lang/String;)V
这里括号里面内容表示的是入参,括号外面表示的是返回参数(V表示返回void)
所以,我们再回到之前的描述
#1 = Methodref #4.#20 // java/lang/Object."<init>":()V
这里表示的是
Object类的无参并且返回值为void的构造方法(<init>这个方法特指构造方法)