- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《Classworking 工具箱 分析泛型数据结构》.doc
Java? 5 泛型把详细的类型信息编码到类文件中。许多类型的工具都可以从全面的类型信息提供的改进的数据结构中受益,但是要把这个信息变成有用的形式可能有些困难。为了让这个工作更容易些,系列作者 Dennis Sosnoski 围绕 ASM Java 字节码操纵框架构建了一个数据结构分析程序,可以解释泛型信息,为应用程序使用的数据的实际数据类型创建深度的视图。
类处理工具实际上就是一个把其他程序当成数据的程序,通常会修改或重新塑造目标程序,以满足某些目的。在把程序当成数据的时候,如果构建一个关于程序自身内部数据结构的模型,协助对修改进行指导,那么通常是有用的。可以利用反射,在第一次把目标程序的类文件装入 JVM 之后,创建这种类型的模型。也可以用框架直接从类文件解码出数据结构信息,甚至从源代码进行解码。不论采用何种技术,目的都是得到应用程序使用的对象之间关系的尽可能全面的视图。
Java 5 程序中的泛型信息,提供了应用程序数据结构的详细地图。泛型之前的程序,只要运行到 Java 集合类或使用无类型引用的应用程序类时,数据结构的分析就走进了死胡同。如果没有某种形式的外部信息,就没有办法知道无类型引用链接到什么类型的对象。在使用泛型时,可以提供附加信息作为源代码的一部分,然后编译器会把附加的引用类型信息直接整合到二进制的类文件中。利用这种内嵌的泛型信息是建立对象之间关系的更丰富视图的关键所在。
向专家 Dennis Sosnoski 请教关于 JVM 和字节码的问题
如果对于这个文章系列中涉及的材料有意见和问题,以及有其他任何关于 Java 字节码、Java 二进制类格式或一般性的 JVM 问题,请访问 Dennis Sosnoski 主持的 JVM 和字节码 论坛。
在这个系列的前两篇文章(“反射泛型” 和 “泛型与 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 TypeDescription getType() {
return m_type;
}
}
public abstract class TypeDescription
{
文档评论(0)