快速业务通道

Classworking工具箱: 分析泛型数据结构 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

Classworking工具箱: 分析泛型数据结构

时间:2011-10-16 IBM Dennis Sosnoski

应用类型替换深入挖掘使用泛型的程序的细节

简介:Java™ 5 泛型把详细的类型信息编码到类文件中。许多类型的工具都可以从全面的类型 信息提供的改进的数据结构中受益,但是要把这个信息变成有用的形式可能有些困难。为了让这个工作更 容易些,系列作者 Dennis Sosnoski 围绕 ASM Java 字节码操纵框架构建了一个数据结构分析程序,可 以解释泛型信息,为应用程序使用的数据的实际数据类型创建深度的视图。

类处理工具实际上就是一个把其他程序当成数据的程序,通常会修改或重新塑造目标程序,以满足某 些目的。在把程序当成数据的时候,如果构建一个关于程序自身内部数据结构的模型,协助对修改进行指 导,那么通常是有用的。可以利用反射,在第一次把目标程序的类文件装入 JVM 之后,创建这种类型的 模型。也可以用框架直接从类文件解码出数据结构信息,甚至从源代码进行解码。不论采用何种技术,目 的都是得到应用程序使用的对象之间关系的尽可能全面的视图。

Java 5 程序中的泛型信息,提供了应用程序数据结构的详细地图。泛型之前的程序,只要运行到 Java 集合类或使用无类型引用的应用程序类时,数据结构的分析就走进了死胡同。如果没有某种形式的 外部信息,就没有办法知道无类型引用链接到什么类型的对象。在使用泛型时,可以提供附加信息作为源 代码的一部分,然后编译器会把附加的引用类型信息直接整合到二进制的类文件中。利用这种内嵌的泛型 信息是建立对象之间关系的更丰富视图的关键所在。

在这个系列的前两篇文章(“反射泛型” 和 “泛型与 ASM”)中,我首先介绍了使用反射得到泛型 信息的基础知识,然后对于使用 ASM 字节码框架处理类文件的原始泛型信息作了详细介绍。在这篇文章 中,我把 ASM 技术用得更深入一点儿,在泛型类定义中使用类型替换来构建目标应用程序数据结构的增 强视图。在进入分析类所使用的实际 ASM 代码之前,我先介绍表示和组织数据结构信息时一些比较简单 的问题。

表示数据结构

在构建分析程序时的第一个问题是,定义目标程序使用的数据结构的表示形式。这必须不仅包含每个 字段值的表示,还要包含每个值的类型信息的表示。因为我想在这一期中演示泛型的解码,所以类型信息 需要包含泛型引用所使用的具体的参数类型。

清单 1 显示了我用作基本数据结构表示的类。FieldDescription 类只是个简单的数据类,容纳字段 名称、签名和字段类型的引用。正如我在 前一期 中介绍的,签名是泛型添加到类文件格式中的项目;只 有对泛型的引用才有签名。签名定义了泛型实际使用的参数类型,所以它提供了处理类型替换时需要的信 息。对于没有签名的字段,将只使用 null 值。最后,字段类型都是 TypeDescription 类的实例,如清 单 1 所示:

清单 1. 基本数据结构类

public class FieldDescription {    // every field has a name    private final String m_name;    // only fields that are of generic types have signatures    private final String m_signature;    // type only defined when parameter types are defined    private final TypeDescription m_type;    public FieldDescription(String name, String sig, TypeDescription type) {      m_name = name;      m_signature = sig;      m_type = type;    }    public String getName() {      return m_name;    }    public String getSignature() {      return m_signature;    }    public 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号