一种动态替换类中字段的方法技术

技术编号:7898027 阅读:273 留言:0更新日期:2012-10-23 04:15
本发明专利技术提供一种动态替换类中字段的方法,属于程序开发领域。所述方法通过原有类中的方法生成抽象类,并根据抽象类的具体实现类来实现原有类的实例化,当检测出原有类中的任何需要读取或修改被增强类字段的调用,改变为自定义的一种调用方式,当检测出原有类中任何需要调用被增强类方法的调用,均改变为自定义的一种调用方式,从而实现在无需重启JVM的情况下动态替换类中的字段。

【技术实现步骤摘要】

本专利技术涉及程序开发领域,特别是涉及。
技术介绍
在实际Java程序开发中,Java程序开发者须经常对代码进行反复修改测试,而每次的修改测试需要重建构件部署整个应用系统,从而耗费大量时间在等待中。若开发者无需重新构件部署整个应用系统,只需将修改过的类重新编译替换原系统中的类文件即可,而类文件替换的工作在大多数开发环境下可以快速自动完成。这样开发者就无需花费大量的等待时间,从而显著提高开发效率。解决该问题的关键之一在于,如何才能在不重启JVM(Java Virtual Machine, Java虚拟机)的前提下将现有的Java类中的字段修改后动态进行替换。 通常,针对类中字段动态替换的问题,现有技术中已有一些解决方案,如一种方案是利用Java ClassLoader,该方案利用的是Java ClassLoader对类的加载机制,自己编写设计一个针对系统的ClassLoader,使其当有需要的时候,利用ClassLoader可以重新加载修改后的类文件。但这种方案的缺点是需要开发者额外自行设计一套适合其程序系统的类加载文件,可能这原本并不是需要考虑开发的,无疑增加了开发者的工作量,降低了开发效率,而且这种利用Java ClassLoader对类动态替换的机制,也只能是对特定的类有效。另一种方案是利用JVM HotSwap,该方案是利用JVM的DebuggerAPI,从而允许通过调用这些API对类的字节码(ByteCode)进行替换。但其缺点是首先,程序必须在debug模式下运行,这可能会给程序带来很多不必要的问题;其次,其只允许对方法体内的代码进行修改,不允许添加任何方法、字段,以及其他的任何操作,使得修改的范围比较局限。再一种方案是利用其他特制的JVM,该方案利用Java程序是在一个虚拟机中运行的,对于Java程序来说,并不关心具体在什么虚拟机上运行,所以可以实现一个Java虚拟机使得其附有类动态替换的功能。其缺点是利用特制的JVM的方案,会存在稳定性、兼容性以及效率上的各种问题,除非主流的JVM在设计上进行改革,使得其在兼容各方面的情况下,附有类动态替换的功能,否则使用该方案还是存在较多风险。因此有必要提出一种新的技术方案来解决上述问题。
技术实现思路
本部分的目的在于概述本专利技术的实施例的一些方面以及简要介绍一些较佳实施例。在本部分以及本申请的说明书摘要和专利技术名称中可能会做些简化或省略以避免使本部分、说明书摘要和专利技术名称的目的模糊,而这种简化或省略不能用于限制本专利技术的范围。本专利技术的目的在于提供,其可以在不重启JVM的情况下动态更改类中字段,显著提高开发效率。为实现上述目的,本专利技术提供,其包括启动JVM,加载一个新的类,判断该类是否为第一次被载入;若所述类被第一次载入,则在全局信息表中注册该类中所有字段信息;用一字段信息类字段代替该类中的所有字段信息并对其初始化;利用该类中的方法信息生成一抽象类,并在该类中定义一该抽象类类型的字段;根据该类中的方法信息和所述抽象类生成所述抽象类的一具体实现类,将该类中任何需要读取或修改被增强类字段的调用,均改为调用该类中字段信息类的获取字段方法或修改字段方法,对类中任何需要调用被增强类方法的调用,均改为调用该类中所述抽象类类型字段对应的方法;检测该类是否被动态更新,若该类被动态更新则使用动态更新前的最后一抽象类的具体实现类将其初始化;和否则,在全局信息表中检测更新其字段的信息;利用该类中的方法信息以及该类在第一载入时生成的抽象类生成所述抽象类的一个具体实现类,将该类中任何需要读取或修改被增强类字段的调用,均改为调用该类中字段信息类的获取字段方法或修改字段方法,对类中任何需要调用被增强类方法的调用,均改为调用该类中所述抽象类类型字段对应的方法。进一步的,启动JVM时还包括加载一动态链接库,所述动态链接库包括接口和内部函数,且利用接口调用内部的函数以对所述类、抽象类以及具体实现类进行处理。 进一步的,加载一个新的类,包括在0]^88 File Load Hook事件被触发后加载一个新的类。进一步的,判断该类是否为第一次被载入,包括分析所述被加载的类的字节码,根据全局信息表检查该类的ClassLoader以判断该类是否被第一次载入。进一步的,在全局信息表中注册类中所有字段信息,包括根据该类中的所有字段,并用该类的ClassLoader以及该类的签名,在全局信息表中注册该类中所有字段信息,以表明该类被增强。进一步的,用一字段信息类字段代替该类中的所有字段信息并对其初始化,包括将所述类中的所有字段均提取出来,用一字段信息类字段来代替,添加一静态初始化块,利用所提取出来的字段信息对所述自定义的字段信息类字段进行初始化。更进一步的,所述字段信息类字段包含一哈希表、所述获取字段方法和所述修改字段方法。更进一步的,所述获取字段方法包括从全局信息表中查询该ClassLoader下该类的所有字段信息,以判断所述字段信息中是否包含该字段,若不包含则产生一个无该字段的异常;若需要获取的该字段为静态字段信息,则从全局信息表中查询该ClassLoader下该类的该增强类字段的值,并以一 Object返回;若需要获取的该字段为非静态字段信息,则从本信息类中的hash表中获取该增强类字段的信息,并以一 Object返回。更进一步的,所述修改字段方法包括从全局信息表中查询该类加载下该类的最新字段信息,以判断最新字段信息中是否包含该字段,若不包含则产生一个无该字段的异常,若该字段为不允许修改的,产生一个不允许修改的异常;若需要修改的字段为静态字段,则从全局信息表中设置该类加载下该类的该字段的值;若需要修改的字段为非静态字段,则从本信息类中的哈希表中修改该字段的值。进一步的,所述抽象类中包含所述类中所有的方法,且抽象类中的所述方法均为抽象方法。与现有技术相比,本专利技术使用JVMTI (JVM Tool Interface)中一个特定事件ClassFile Load Hook,该事件会在JVM获得一个类数据文件后,但在将其构建成一个类放到内存中前调用,在该事件触发的函数中,可以对该类文件的字节码进行任意改动。本专利技术主要就是从该事件被触发后介入,对类文件进行修改增强,从而实现在无需要重启应用系统的情况下,将对类中字段有过任何改动的类,以及类中现有方法体有过任何改动的类进行动态替换。附图说明为了更清楚地说明本专利技术实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本专利技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。其中图I为本专利技术中动态替换类中字段的方法的流程图;和 图2为本专利技术中类被第一次载入后其字段被动态替换的方法流程图。具体实施例方式本专利技术的详细描述主要通过逻辑块或其他概括性的描述来直接或间接地表述了本专利技术技术方案的运作。为透彻的理解本专利技术,在接下来的描述中陈述了很多特定细节。而在没有这些特定细节时,本专利技术则可能仍可实现。此处的这些描述和陈述主要是为了向所属领域内的其他技术人员有效的介绍本专利技术技术方案的本质。换句话说,为避免混淆本专利技术的目的,由于熟知的方法和程序已经容易理解,因此它们并未被详细描本文档来自技高网
...

【技术保护点】

【技术特征摘要】

【专利技术属性】
技术研发人员:刘钟泽
申请(专利权)人:深圳市金蝶中间件有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1