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

https://mingshan.fun/2018/09/18/fully-qualified-name-simple-name-descriptor/

在看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;, 没什么错^_^

posted on   gogoy  阅读(2080)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示