`
Willam2004
  • 浏览: 88013 次
  • 性别: 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  
没有更快或者更慢。

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

相关推荐

    cglib.jar | asm.jar对应版本

    在实际项目中,为了确保兼容性和稳定性,选择与cglib相匹配的asm版本是非常重要的。例如,这里提到的`cglib-2.1.3.jar`可能需要特定版本的`asm.jar`,具体版本需求应该根据cglib的官方文档或者项目依赖管理工具(如...

    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...

    C-include-ASM.zip_asm中include asm_c语言中嵌套asm

    使用在asm_macros.asm中定义的宏 ; ... 继续其他汇编代码 ... ``` 在这个例子中,`asm_macros.asm`包含了我们希望在`my_func`中使用的汇编宏或其他常用操作。这种方式有助于代码重用和模块化,使得汇编代码更...

    asm2.2版本

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

    asm操作指南(中文)

    - **定义与功能**:ASM是一个Java字节码操纵框架,主要用于动态生成类或增强现有类的功能。通过直接生成二进制`.class`文件,ASM能够在类被加载到Java虚拟机之前动态地改变类的行为。 - **应用场景**: - **程序...

    ASM4手册中文版.pdf.zip

    ASM4是中国Java开发者常用的一款字节码操作框架ASM的第四个主要版本,它主要用于动态生成和分析Java字节码。ASM是一个低级别的库,可以直接操作和生成类的字节码,这在创建编译器、代码分析工具以及运行时代码修改等...

    ASM4中文使用指南.zip

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

    ASM4使用指南 ASM GUIDE

    6. **版本控制与协作**:ASM4支持版本控制功能,允许团队成员协同工作,跟踪模型的变更历史,确保项目的一致性和完整性。 7. **教程与学习资源**:"ASM4使用指南.pdf"文件应包含了关于如何启动ASM4,创建第一个模型...

    ASM 1351.zip

    1. **AsmediaTest_1351FWUpg1181_141210310000_V1.rar** - 这个文件是ASM 1351的固件升级工具,版本号为1.181,发布日期可能是2014年12月10日。固件升级是针对硬件设备的软件部分进行更新,以修复已知问题、提升性能...

    ASM matlab版本

    文件"41951552asm"可能是ASM模型的MATLAB代码文件,包含了实现ASM模型的所有细节,包括数据读取、预处理、模型定义、参数优化和结果评估等步骤。为了更好地理解和使用这个模型,你需要熟悉MATLAB编程,并理解ASM模型...

    Oracle 10.2 ASM 最佳实践 最终版本

    - **定义**:磁盘组是ASM中一组物理磁盘的逻辑集合。 - **类型**:根据冗余级别不同,磁盘组可分为NORMAL REDUNDANCY和HIGH REDUNDANCY。 #### 磁盘组与数据库 - **关联性**:每个数据库实例至少需要一个磁盘组来...

    asm6.0 jar包

    标题提及的"asm6.0 jar包"是ASM框架的一个版本,版本号为6.0_ALPHA。这通常意味着它是该版本的一个早期预览版,可能包含一些不稳定或未完全测试的功能。发布页面位于...

    ASM1153E_多固件版本.rar

    在本压缩包"ASM1153E_多固件版本.rar"中,包含了ASM1153E不同日期版本的固件,这些固件更新旨在优化性能、提升兼容性或解决特定问题。 首先,让我们详细了解一下141125版本。这个固件版本支持ODD,即Optical Disk ...

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

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

    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; ...

    开发工具 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 最新版手册

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

    EditPlus(附asm.acp,asm.stx)

    `.acp`文件代表“语法高亮配置文件”,它定义了特定语言(在这里是汇编语言)的语法色彩规则,使代码在编辑器中以不同颜色显示,便于理解和调试。`.stx`文件则是“样式表文件”,它包含一系列格式设置规则,如字体、...

    一套匹配的cglib和asm的jar包。

    CGILib和ASM是两个在Java编程中广泛使用的库,特别是在动态代理和字节码操作领域。它们在创建和修改Java类的字节码时扮演着重要角色。 **CGILib** 是一个强大的、高性能的代码生成库,它在运行期扩展Java应用程序并...

    ASM 中文教程包含一个拼图游戏

    4. **图形处理**:在ASM中处理图像,包括像素操作、颜色处理,以及可能涉及的图形库调用。 5. **算法实现**:拼图游戏的逻辑涉及到排序、查找等算法,学习如何用ASM实现这些算法。 6. **程序结构**:模块化编程,...

Global site tag (gtag.js) - Google Analytics