首页 > 其他分享 >全限定名、简单名称和描述符是什么东西?

全限定名、简单名称和描述符是什么东西?

时间:2023-11-02 10:24:55浏览次数:22  
标签:lang String 限定 double int 描述符 名称 JVM

在看Class文件的结构时,我们会遇到这样几个概念,全限定名(Fully Qualified Name)、简单名称(Simple Name)和描述符(Descriptor),那么这些是什么东东呢?

首先来说全限定名,一个类的全限定名是将类全名的.全部替换为/,示例如下:

me/mingshan/cglib/SampleClass

简单名称是指没有类型和参数修饰的方法或字段名称,比如一个类的test()方法,它的简单名称是test

那么描述符是什么呢?下面是JVM规范的定义:

A descriptor is a string representing the type of a field or method.

注意描述符的概念是针对Java字节码的。描述符的作用是用来描述字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值。在JVM规范中,定义了两种类型的描述符,Field Descriptors 和 Method Descriptors。

Field Descriptors

A field descriptor represents the type of a class, instance, or local variable.

字段描述符包含BaseType、ObjectType、ArrayType三部分,对于基本数据类型(byte、char、double、float、int、long、short、boolean)都用一个大写字母来表示,而对象用字符L加对象的全限定名和来表示,具体表示如下:

FieldType term Type Interpretation
B byte signed byte
C char Unicode character code point in the Basic Multilingual Plane, encoded with UTF-16
D double double-precision floating-point value
F float single-precision floating-point value
I int integer
J long long integer
L ClassName ; reference an instance of class ClassName
S short signed short
Z boolean true or false
[ reference one array dimension

对于数组类型,每一个维度使用一个前置的[来描述,如一个定义为java.lang.String[][]类型的二维数组,将被记录为[[Ljava/lang/String;,一个double型数组double[][][]将被记录为[[[D

Method Descriptors

A method descriptor contains zero or more parameter descriptors, representing the types of parameters that the method takes, and a return descriptor, representing the type of the value (if any) that the method returns.

方法描述符用来描述方法,一个方法既有参数,又有返回值,那么在用描述符描述方法时,按照先参数列表,后返回值的顺序描述。参数列表按照参数的严格顺序放在一组小括号()内,如下:

( {ParameterDescriptor} ) ReturnDescriptor

注意如果返回值为void,那么就是一个大写字母V表示。

例如,一个方法的定义如下:

Object m(int i, double d, Thread t) {...}

那么它的描述符就是:

(IDLjava/lang/Thread;)Ljava/lang/Object;

又如方法的参数列表和返回值为空,如下:

void test()

它的描述符为:

()V

最后上代码分析一波

我们新建Test类,包含一个成员变量和方法。

package me.mingshan.cglib;

public class Test {
    private int a;

    public String inc(int b) {
        int c = a + b;
        return c + "666";
    }
}

利用javap -c Test来查看字节码,如下:

public class me.mingshan.cglib.Test {
  public me.mingshan.cglib.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public java.lang.String inc(int);
    Code:
       0: aload_0
       1: getfield      #2                  // Field a:I
       4: iload_1
       5: iadd
       6: istore_2
       7: iload_2
       8: invokedynamic #3,  0              // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
      13: areturn
}

可以看到Field a:I(I)Ljava/lang/String;, 没什么错_

参考:

  • jls
  • JVM Descriptor
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)

title: 全限定名、简单名称和描述符是什么东西?
author: Mingshan
tags: JVM
categories: [JVM, Bytecode]
date: 2018-9-18

标签:lang,String,限定,double,int,描述符,名称,JVM
From: https://www.cnblogs.com/mingshan/p/17793535.html

相关文章

  • 如何为多个提交更改作者和提交者名称/电子邮件?
    内容来自DOChttps://q.houxu6.top/?s=如何为多个提交更改作者和提交者名称/电子邮件?如何更改一系列提交的作者?如何更改一系列提交的作者?要更改一系列提交的作者,需要重写所有历史记录。如果您不介意这一点并认为值得这样做,那么您应该查看gitfilter-branch。手册页面包括......
  • Net 高级调试之三:类型元数据介绍(同步块表、类型句柄、方法描述符等)
    一、简介今天是《Net高级调试》的第三篇文章,压力还是不小的。上一篇文章,我们浅浅的谈了谈CLR和Windows加载器是如何加载Net程序集的,如何找到程序的入口点的,有了前面的基础,我们今天看一点更详细的东西。既然Windows操作系统已经加载了CLR,初始化了应用程序域,加载......
  • 批量修改Fasta文件中序列的名称
    比如一个Fasta文件的内容如下:seq001|aaaATCGGGGseq002|bbbAAAATTTT删除序列名称中“|”后的内容,只保留seq001,seq002这样的名称点击查看代码#!/usr/bin/envpythonimportsysimportpysamwithpysam.FastxFile(sys.argv[1])asfh:forrinfh:new_n......
  • 使用 excel 快速拼接省市区镇街村居五级区划完整名称
    你知道的越多,你不知道的越多点赞再看,养成习惯文章目录前言数据准备excel函数附件前言之前做了国家区划的映射关系,在其过程中,使用代码区拼接完整的五级区划,感觉还是比较麻烦的,后面偶然在excel上发现可以使用函数去完成这个拼接操作,记录一下方法。数据准备首先需要准备3个广......
  • Spring Bean 名称暗藏玄机,这样取名就不会被代理
    一些使用小细节就是在不断的源码探索中逐步发现的,今天就来和小伙伴们聊一下通过beanName的设置,可以让一个bean拒绝被代理!1.代码实践假设我有如下一个切面:@Aspect@EnableAspectJAutoProxy@ComponentpublicclassLogAspect{@Pointcut("execution(*org.javaboy.demo.s......
  • openapi-generator修改默认生成的Model文件名称
    openapi-generator为各种语言都以抽象类的形式进行了默认配置以Typescript为例,其中的抽象类路径为openapi-generator\modules\openapi-generator\src\main\java\org\openapitools\codegen\languages\AbstractTypeScriptClientCodegen.java其中的toTypescriptTypeName方法则对生......
  • 运动排名称号
    /***运动排名,睡眠排名,饮食排名,情绪排名*如果排名都在前20%,就是最强王者,*如果取最大的两个大于90%,他的称号就是前两个排名组合称号,比如运动加睡眠,就是元气满满追风人,*如果是睡眠加运动,就是元气满满训练家**@return*/publicst......
  • 金蝶KIS VB插件 老单据如何插入多行值,老单获取基础资料内码、代码、名称
    转自:https://blog.csdn.net/ssyyll/article/details/16804273WhileNotrs.EOF '填充对应的行 Withm_BillTransfer '如果超过两行以上的值,需要先用 .BillForm.InsertRow '插入一行 .SetGridTextLRow,dicFieldEntry("FItemID"),rs("FNumber") .SetGridText......
  • 导航栏动态显示用户名称
    我们想要实现上方导航栏当用户登录时,显示当前用户名以及更多操作没有用户登录时,显示登录以及注册这时候我们就要用到一个新方法.is_authenticated判断是否有用户登录代码示例{%ifrequest.user.is_authenticated%}<li><ahref="#">{{request.user.username}}</a></l......
  • 在 vs2022 中为 c# 项目输出的程序集指定名称
    c#项目中,生成的程序集的命名一般是项目名称,大多数时候,项目名需要写英文,而生成的程序名字也是项目名,不便于用户理解。vs2022允许修改程序集名称,可以直接指定中文项目名。操作路径:右键项目=>属性=>应用程序=>常规=>程序集名称.......