`
Willam2004
  • 浏览: 86897 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于ASM中版本号定义的疑问

    博客分类:
  • Java
阅读更多
在asm的源码中看到Opcodes类文件中,有这么一段,定义了java class文件的版本号:
    int V1_1 = 3 << 16 | 45;
    int V1_2 = 0 << 16 | 46;
    int V1_3 = 0 << 16 | 47;
    int V1_4 = 0 << 16 | 48;
    int V1_5 = 0 << 16 | 49;
    int V1_6 = 0 << 16 | 50;
    int V1_7 = 0 << 16 | 51;
 

中间涉及到java的位运算的操作,学习java以来,对位运算一直处于半瓶子的状态,正好借着这个机会,认真学习下。
java的位运算操作符包含:

    &(and),~(not),^(xor),|(or),>>(右移),>>>(无符号右移),<<(左移)
 


上面的java代码中主要用到了[<<左移操作符]和[|或]操作符。左移操作符功能把“<<”左边的运算数的各二进位全部左移若干位,由“ < <”右边的数指定移动的位数, 高位丢弃,低位补0.如 3 << 4,3对应的二进制表达式为:00000011,那么左移4位为:00110000(十进制为48).
而“|”操作符,是将|两边的数值进行或值进行运算,只要两边的任意一方是1那么,那么结果就为1.如: 0 | 10 =  0 | 1010 = 1010 = 10; 0与任意数进行相或运算,结果都是另一边的数值。
    接下来先看下上面的代码中的V1_2至V1_7,0 << 16,将0向左移16位,还是0,那么0再与右边的数字想或,那么结果就还是右边的的数值。如V1_2 = 46,V1_3=47以此类推。而V1_1先是 3<<16,我算了下是196608,再与45相或那么是196653,版本号有这么大么?我表示怀疑。上网查了下jdk1.1生成的版本号是45.3,其中45是主版本号,而3是次版本号。那为什么是196608这个数值呢?
于是我开始下面的实验:
用命令javac -target 1.1 Example.java文件,生成的class文件,用十六进制编辑器打开class文件:
  根据class文件的结构,开头是魔数,后面是次版本号+主版本号,为0003002D的十六进制。将V1_1的数值用16进制表示发现:
 
    String s = Integer.toHexString(V1_1);
    System.out.println(s); //输出3002d
  

  输出的字符串正好是class文件中16进制表示的字符串,所以说asm并没有错误。
  asm通过将十六进制的主版本号和次版本号一起作为一个int数值进行读取,所有才有上面看
  似不正确的版本数值。至于为什么用位运算来写,我想可能有以下原因:
  1.位运算的操作速度更快(这个并没有什么提高或者变慢,因为编译后,用javap查看,发现已变成数值常量)
  2.修改jdk的主版本号或者次版本号更方便。
分享到:
评论
2 楼 Willam2004 2011-02-09  
kimmking 写道
没有更快或者更慢。

编译后,上面代码每句的右边都是常数了。


用javap -verbose查看了下,是变成一个int型的常量了,没有什么速度上的提高。谢谢指正。
1 楼 kimmking 2011-02-09  
没有更快或者更慢。

编译后,上面代码每句的右边都是常数了。

相关推荐

    asm.jar各个版本

    asm-1.3.3.jar, asm-1.3.4.jar, asm-1.3.5.jar, asm-1.4.1.jar, asm-1.4.2.jar, asm-1.4.3.jar, asm-1.4.jar, asm-1.5.1.jar, asm-1.5.2.jar, asm-1.5.3.jar, asm-2.0.jar, asm-2.1.jar, asm-2.2.1-sources.jar, asm...

    cglib.jar | asm.jar对应版本

    cglib.jar 和 asm.jar 对应版本

    asm2.2版本

    asm2.2版本,比较老的版本,含 ClassAdapter,一般为旧项目补包所用

    ASM4中文使用指南.zip

    Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    ASM1153E_多固件版本.rar

    最全的ASM1153E移动硬盘(msata2USB)固件合集, 其中 141125是支持ODD的, 160316是TRIM UASP, 140704是UASP

    Oracle 10.2 ASM 最佳实践 最终版本

    Oracle 10.2 ASM 最佳实践 ASM installation ASM SGA and parameter sizing ASM and privileges ASMLIB Disks ASM and Multipathing DiskGroups Diskgroups and databases ASM redundancy and Failure Groups New ...

    asm-9.1-API文档-中文版.zip

    赠送jar包:asm-9.1.jar; 赠送原API文档:asm-9.1-javadoc.jar; 赠送源代码:asm-9.1-sources.jar; 赠送Maven依赖信息文件:asm-9.1.pom; 包含翻译后的API文档:asm-9.1-javadoc-API文档-中文(简体)版.zip; ...

    ASM4.0 中文教程与多种字节码编程实战案例

    内容包含ASM4.0中文手册,以及四种ASM常见的字节码操作应用范例,包含最新版本的ASM9.2的jar包,包含asm-9.2.jar,asm-commons-9.2.jar,asm-util-9.2.jar。 学习文章地址 ...

    asm操作指南(中文)

    Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    asm-6.2.1-API文档-中英对照版.zip

    赠送jar包:asm-6.2.1.jar; 赠送原API文档:asm-6.2.1-javadoc.jar; 赠送源代码:asm-6.2.1-sources.jar; 赠送Maven依赖信息文件:asm-6.2.1.pom; 包含翻译后的API文档:asm-6.2.1-javadoc-API文档-中文(简体)-...

    汇编工具ASM汇编工具ASM汇编工具ASM汇编工具ASM

    汇编工具ASM汇编工具ASM汇编工具ASM汇编工具ASM汇编工具ASM

    ASM中文帮助文档

    java修改字节码高效框架ASM中文帮助文档,学ASM看这一个文档就够了

    EditPlus(附asm.acp,asm.stx)

    EditPlus是很好用的编辑软件 但网上下的很多EP版本需要自己添加asm.acp,asm.stx,不是很方便 这个里面附带了asm.acp,asm.stx

    ASM4使用指南 ASM GUIDE

    ASM4使用指南 ASM GUIDE

    asm4-guide.pdf

    Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    asm 最新版手册

    Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    各种oracleasm rpm包(Linux下配置ASM使用)

    包含如下oracleasm包: kmod-oracleasm-2.0.6.rh1-3.el6.x86_64.rpm oracleasm-2.0.8-4.el6_6.src.rpm oracleasm-2.0.8-6.el6_7.src.rpm oracleasm-2.0.8-8.el7.src.rpm oracleasm-2.0.8-15.el7.centos.src.rpm ...

    asm-commons-5.2.jar 涉及版本升级的包

    struts升级包 asm-commons-5.2.jar 涉及版本升级的包

    开发工具 asm-5.1

    开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具...

    ASM matlab版本

    很实用的ASM模型,matlab版,实验用过,编译能通过

Global site tag (gtag.js) - Google Analytics