使用 ASM 实现 Java 语言的“多重继承”.pdf

使用 ASM 实现 Java 语言的“多重继承”.pdf

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用 ASM 实现 Java 语言的“多重继承”

12-8-27 使用 ASM 实现 Java 语言的“多重继承” 使用 ASM 实现 Java 语言的“多重继承” 问题的提出 在大部分情况下 ,需要多重继承往往意味着糟糕的设计。但在处理一些遗留项 目的时候 ,多重继 承可能是我们能做出的选择中代价最小的。由于 Java 语言本身不支持多重继承 ,这常常会给我 们带来麻烦 ,最后的结果可能就是大量的重复代码。本文试图使用 ASM 框架来解决这一问题。 在扩展类的功能的同时 ,不产生任何重复代码。 考虑如下的实际情况 :有一组类 ,名为 SubClass1、SubClass2、SubClass3 和 SubClass4 ,它 们共同继承了同一个父类 SuperClass。现在 ,我们需要这组类中的一部分 ,例如 SubClass1 和 SubClass2 ,这两个类还要实现另外两个接口 ,它们分别为 :IFibonacciComputer 和 ITimeRetriever。然而 ,这两个接口已经有了各 自的实现类 FibonacciComputer 和 TimeRetriever。并且这两个类的实现逻辑就是我们想要的 ,我们不想做任何改动 ,只希望在 SubClass1 和 SubClass2 两个类中包含这些实现逻辑。 它们的结构如图 1 所示 : 图 1. 结构类图 由于 SubClass1,SubClass2 已经继承了 SuperClass ,所以我们无法让它们再继承 FibonacciComputer 或 TimeRetriever。 所以 ,想要它们再实现 IFibonacciComputer 和 ITimeRetriever 这两个接口 ,必然会产生重复代 码。 下面 ,我们就使用 ASM 来解决这个问题。 回页首 Java class 文件格式以及类加载器介绍 /developerworks/cn/java/j-lo-asm/index.html 1/16 12-8-27 使用 ASM 实现 Java 语言的“多重继承” 在后面的内容中 ,需要对 Java class 文件格式以及类加载器的知识有一定的了解 ,所以这里先 对这些内容做一个简单介绍 : class 文件格式 Java class 文件的结构如图 2 所示 (图中“*”表示出现 0 次或任意多次 ) : 图 2.Java class 文件结构 详细说明如下 : Magic Number: 每个 class 文件的前 4 个字节被称为“魔数” ,它的内容为 :0xCAFEBABE。 魔数的作用在于可以轻松地分辨出一个文件是不是 class 文件。 Version: 该项指明该 class 文件的版本号。 Constant Pool: 常量池是 class 文件中结构最为复杂 ,也最为重要的部分。常量池包含了与 文件中类和接口相关的常量。常量池中存储了诸如文字字符串 ,final 变量值。Java 虚拟机把 常量池组织为入口列表的形式。常量池中许多入口都指向其他的常量入口 ,而且 class 文件中 紧随着常量池的许多条 目也都会指向常量池的入口。除了字面常量之外 ,常量池还可以容纳以 下几种符号引用 :类和接口的全限定名 ,字段的名称和描述符和方法的名称和描述符等。 Modifiers: 该项指明该文件中定义的是类还是接口 ,以及声明中用了哪种修饰符 ,类或接口 是私有的 ,还是公共的 ,类的类型是否是 final 的 ,等等。 This class: 该项是对常量池的索引。在这个位置 ,Java 虚拟机能够找到一个容纳了类或接 口全限定名的入口。这里需要注意的是 :在 class 文件中 ,所有类的全限定名都是以内部名称 形式表示的。内部名称是将原先类全限定名中的“.”替换为“/”。例如 :j ava.lang.String 的内部 名称为 j ava/lang/String。 Super Class: 该项也是对常量池的索引 ,指明了该类超类的内部名称。 Int

文档评论(0)

almm118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档