jvm之字节码解读——番外篇之JNI字段描述符

在上一篇文章中 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>这个方法特指构造方法)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值