JVM 符号引用(Symbolic References)

符号引用


  • 什么是符号引用?在说符号引用之前我们先来看看直接引用,直接引用是什么,比如就是你拥有你所需要数据的地址值,可以直接根据地址值获取到数据。但是 java语言是解释性的语言,然后由于总总原因(我也不知道对不对的原因)在某些时刻有些东西的直接地址还并不存在,是无法使用直接引用。这时候就可以用到符号引用了。
  • 符号引用:符号引用是一个字符串,它给出了被引用的内容的名字并且可能会包含一些其他关于这个被引用项的信息——这些信息必须足以唯一的识别一个类、字段、方法。这样,对于其他类的符号引用必须给出类的全名。对于其他类的字段,必须给出类名、字段名以及字段描述符。对于其他类的方法的引用必须给出类名、方法名以及方法的描述符。这样我们就能根据符号引用锁定唯一的类,方法或字段了。

JNI字段描述符


  • JNI字段描述符是类描述符,方法描述符,字段描述的具体的实现规则,下面我将一一介绍。

类描述符


  • 例:
类:Java.lang.String
对应描述符:Ljava/lang/String;
  • 类描述符的规则是以L开头,其后跟着该类的全限定名,并将其中中的 “.” 改为 “/” ,最后分号“;”结束(只有 类描述符需要以分号结束好像,基本类型的不需要)。
  • 再补上其他基本类型的符号(由于基本类型不存在全限定名,只需要一个符号就可以表达该基本类型)
java类型 符号
boolean Z
byte B
char C
short S
int I
long J
float F
double D
void V

字段描述符


  • 好像类描述符也是字段描述符,有点晕~。我们确定一个字段,只需要字段描述符和字段名两部分。那好像除了字段名,字段描述符只需要描述类型就可以了,所以类描述符好像等价于了字段描述符。
  • 例:
int num=3;
字段描述符:I;
字段名:num
  • 但是字段还有数组类型,数组的描述规则如下
String[][] num=null;
字段描述符:[[Ljava/lang/String;
字段名:num
  • 数组类型只需要原描述符在前面加一个[,如果是二维数组就加[[,以此类推。

方法描述符

  • 例1:
String test();
方法描述符:()Ljava/lang/String;
方法名:test
  • 例2:
long test(int i, Object c);
方法描述符:(ILjava/lang/Object;)J
方法名:test
  • 例3:

void test(byte[] bytes);
方法描述符:([B)V
方法名:test
  • 三个例子很清晰的就能看明白了,方法描述符就是“()”和参数与返回值的字段描述符的组合,组合规则是:
(第一个参数的字段描述符第二个参数的字段描述符.....)返回类型的描述符

猜你喜欢

转载自blog.csdn.net/u014296316/article/details/83066436