1. 首页
  2. > 资质代办 >

u1u2深圳如何注册公司商标(银河u1和u2)



十六进制文本如下,便于后续分析使用:



完商标整的Java字节码结构图:


接下来结合十六进制格式的 class 文件,参照 Java字节码文件来剖析下都包含了哪些内容。


上述常量都是以「CONSTANT」开头,以「info」结尾的常量名。每一个常量包含的信息的段都是不同的,我们和可以根据每一个段自身的起始和结束位置是什么来进行分析。


上深圳述MyTest1类十六进制字节码中的位置:0x 00 21


第一个是access_flags访问标志符,如public、private、protected、final、abstract等等。


具体含义类似于上述的字段表结构。


Code attribute的作用是保存该方法的结构,如所对应的字节码。


  • attribute_length表示attribute所包含的字节数,不包含at如何rribute_name_index和attribu深圳te_length字段。


  • max_stack表示这个方法运行的任何时刻所能达到的操作数栈的最大深度。// 00 02


  • max_locals表示方法执行期间创建的局部变量的数目,包含用来表示传入的参数的局部变量的。// 00 01


  • code_length表示该方法所包含的字节码的字节数以及具体的指令码。也即助记符。/银河/ 00 00 00 0A 转换为十进制值为10,即跟着后面的10个字节 2A B7 00 01 2A 04 B5 00 和02 B1 这些是字节码具体指令,对应到构造方法的字节码:


那么,这些十六进制是怎么和下面的助记符对应的呢?


我们通过jclasslib工具(字节码查看工具,支持IDEA插件形式安装)查看时,点击助记符的链接会注册公司跳到Oracle官网可查看具体详细解释。第一个助记符: 0: aload_0 打开链接可以看到:


链接地址:


https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#u1jvms-6.5.aload_n


具体解释内容所示:


aload_<n>
Operation
Load reference from local variable
Format
aload_<n>
Forms
aload_0 = 42 (0x2a) // 通过这里就能直接看到 aload_0 对应的十进制是42,转换为十六进制就是 0x2a,对应字节码文件中的 2A
aload_1 = 43 (0x2b)
aload_2 = 44 (0x2c)
alou1u2ad_3 = 45 (0x2d)
Description
The <n> must be an index into the local variable array of the current frame (2.6). The local variable at <n> must contain a reference. The objectref in the local u2variable at <n> is pushed ontu2o the operand stack.
这个<n>必须是一个到当前栈帧局部变量数商标组的一个索引,位于<n>位置上的局部变量会包含一个引用,位于<n>位置上的局部变量的这个引用会被推送到栈顶(准备进行操作)。
第二个助记符:
1: invokespecial #1 // Method java/lang/Object."<init>":V
连接地址:https://docs.oracle.com注册公司/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokespecial
invokespecial
Operation
Invoke instance method; special handling for superclass, private, and instance initialization method invocations
Format
invokespecial
indexbyte1
indexbyte2
Forms
invokespecial = 183 (0xb7)
Operand Stack
..., objectref, [arg1,如何 [arg2 ...]] →
...

  • 具体字节码即是该方法被调用时,虚拟机所执行的字节码。


  • e银河xception_table,这里存放的是处理异常的信息。


  • 每个exception_table表项由start_pc,end_pc,handler_pc,catch_type组成。


  • start_pc和end_pc表示在code数组中的从start_pc到end_pc处(包含start_pc,不包含end_pc)的指令抛出的异常会由这个表项来处理。


  • handler_pc表示处理异常的代码的开始处。catch_type表示会被处理的异常类型,它指向常量池里的一个异常类。当catch_type为0时,表示处理所有的异常。


附加属性


LineNumberTable:这个属性用来表示code数组中的字节码和Java代码行数之间的关系。这个属性可以用来在调试的时候定位代码的执行行数。


LocalVariableTable:局部变量表,当前类中只有唯一的局部变量,而这个局部变量就是this当前对象。


局部变量表属性类似于行号表属性。


请注意:


Java源代码角度:Java类中的实例方法中可以u1直接使用this


Java字节码角度: Java类中的非静态方法,即实例方法中的这个this实际是通过编译器隐示的作为方法的第一个参数传递进来(有点类似于Python中的方法,其方法中的第一个参数都会传递一个self变量,表示当前对象本身)。这样使得每一个实例方法内部都可以很顺利的访问this。换句话说针对类的实例方法它至少会有一个LocalVariable局部变量,这个变量就是this



4.7 字段/方法描述符

在JVM规范中,每个变量/字段都有描述信息,描述信息主要的作用是描述字段的数据类型、方法的参数列表(包括数量、类型与顺序)与返回值。根据描述符规则,基本数据类型和代表无返回值的void类型都用一个大写字符来表示,对象类型则使用字符L加对象的全限定名称来表示。为了压缩字节码文件的体积,对于基本数据类型,JVM都只使用一个大写字母来表示,如下所示:


B - byte,C - char,D - doubleu1u2,F - float,I - int,J - long,S - short,Z - boolean,V - void,L - 对象类型,如Ljava/lang/String;


数组类型: 针对数组类型来说,每一个维度使用一个前置的[来表示,如:


int数组被记录[I,String[]二维数组被记录为[[Ljava/lang/String;


方法描述符


用描述符描述方法时,按照先参数列表,后返回值的顺序来描述。参数列表按照参数的严格顺序放在一组之内,如方法:


String getInfoByIdAndName(int id, String name),该方法的描述符为:(I, Ljava/lang/String;)Ljava/lang/String;

Java字节码文件的工具推荐:


https://github.com/ingokegel/jclasslib


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至123456@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息