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

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

原文地址:https://www.cnblogs.com/wxdlut/p/12229562.html

时间: 2024-08-28 13:34:54

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

[Java] Eclipse中复制全限定名(Copy Qualified Name)的效果

在Eclipse中,使用“ Copy Qualified Name”复制类的全限定名有两种效果: (1)选中工程上的java文件,右键 - Copy Qualified Name 复制的效果是带斜杠的项目工程路径地址:/Test/src/demo/servlet/HelloServlet.java (2)在java文件中,将光标放到类名上,右键 - Copy Qualified Name 复制的效果是用“.”分隔的包名+类名的形式:demo.servlet.HelloServlet

【Python】【元编程】【二】【描述符】

""" #描述符实例是托管类的类属性:此外,托管类还有自己实例的同名属性 #20.1.1 LineItem类第三版:一个简单的描述符#栗子20-1 dulkfood_v3.py 使用 Quantity 描述符管理 LineItem 的属性class Quantity:# 描述符基于协议实现,无需创建子类. def __init__(self,storage_name): self.storage_name = storage_name def __set__(self, in

USB描述符【转载】

USB描述符 USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主机分析返回来的数据,判断出该设备是哪一种USB设备,建立相应的数据链接通道.那么USB描述符信息到底是一个什么样的数据呢,USB协议中有详细描述. 通用的USB描述符信息包括设备描述符.配置描述符.接口描述符和端点描述符,具体不同的USB设备还包括其它类型的描述符,例如,USB鼠标.键盘还包括HID

Python 为什么要使用描述符?

学习 Python 这么久了,说起 Python 的优雅之处,能让我脱口而出的, Descriptor(描述符)特性可以排得上号. 描述符 是Python 语言独有的特性,它不仅在应用层使用,在语言的基础设施中也有涉及. 我可以大胆地猜测,你对于描述符的了解是始于诸如 Django ORM 和 SQLAlchemy 中的字段对象,是的,它们都是描述符.你的它的认识,可能也止步于此,如果你没有去深究,它为何要如此设计?也就加体会不到 Python 给我们带来的便利与优雅. 由于 描述符的内容较多,

python中名称修饰与描述符

名称修饰 java和C#等其他高级语言中都有private关键字来修饰一个属性或字段是私有的,但是python中并没有private,而是有个与它接近的概念旧式名称修饰.每当在一个属性前面加上__前缀,解释器就会立刻将其重命名: 直接访问会抛异常 利用dir函数查看内部属性 python内部会把__前缀的属性重命名为[_类名+属性名]:因此在python中如果一个属性不是共有的就约定使用双下划线__为前缀,它不会调用任何名称修饰的算法,只是说名这个属性是该类的私有属性. 幸运的是python中还

传送文件描述符的简单示例

传送进程描述符,简单的来说,就是进程A打开一个文件f,获得了一个文件描述符fd1,然后进程A将该描述符通过某些方式,传递给了B,此时B就具有了描述符fd2(注意,fd1 不一定等于fd2),从而可以通过fd2对文件f进行读写等一系列的操作.其实本质上 相当于A,B两个进程同时打开了文件f. 具体实现其实比较简单,例如当一个父进程要向子进程传递一个文件描述符时,首先会在fork产生子进程以前,调用socketpair建立一个套接字对,用于父子进程之间的通信.之后父进程打开文件f,获得文件描述符fd

Python全栈开发——描述符

6.描述符(__get__,__set__,__delete__)定义:描述符本质就是一个新式类,在新式类中,至少实现了(__get__,__set__,__delete__)中的一个:这也被称为描述符协议__get__:调用一个属性时,触发__set__:为一个属性赋值时,触发__delete__采用del删除属性时,触发#特别注意优先级优先级由高到低分别为:1.类属性2.数据描述符(定义描述符时有__get__和__set__这两种方法)3.实例属性4.非数据描述符5.找不到的属性触发__g

描述符简单应用示例

1 #Author : Kelvin 2 #Date : 2019/1/24 20:57 3 4 #实现目标:控制类的实例化对象时传入的参数值 5 6 #定义描述符 7 class Type(): 8 def __init__(self,key,type): 9 self.key=key 10 self.type=type 11 def __get__(self, instance, owner): 12 # print("get") 13 return instance.__dict

Eclipse和MyEclipse工程描述符.classpath和.project和.mymetadata详解aaaaaa(转)

Eclipse和MyEclipse工程描述符.classpath和.project和.mymetadata详解(转) (2012-03-28 15:06:54) 转载▼ 标签: .mymetadata .project .classpath it 分类: an_tools (今天从ftp上down了个demo项目搞了半天,才出现登录界面,快哭了,而后找到这篇文章.主要是注意.mymetadata文件中的context-root属性,要不你也会哭的.) 正文: 有时候在一个Java工程里我们需要加