CN103176781B - 一种实现软件产品客户化的方法及设备 - Google Patents
一种实现软件产品客户化的方法及设备 Download PDFInfo
- Publication number
- CN103176781B CN103176781B CN201110436019.7A CN201110436019A CN103176781B CN 103176781 B CN103176781 B CN 103176781B CN 201110436019 A CN201110436019 A CN 201110436019A CN 103176781 B CN103176781 B CN 103176781B
- Authority
- CN
- China
- Prior art keywords
- class
- file
- class file
- client
- bao nei
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种实现软件产品客户化的方法及设备,该方法包括:接收对第一包内的一类文件进行加载的请求;以及在客户包内搜索所述类文件,并执行以下操作中的至少一者:如果所述客户包内不存在所述类文件,则使用所述第一包内的类文件创建类对象;及如果所述客户包内存在所述类文件,则判断该类文件是否支持动态代理,如果支持,则使用该类文件创建动态代理类文件,并使用该动态代理类文件创建类对象;及如果不支持,则对该类文件进行字节码级的签名修改,并使用修改之后的类文件创建类对象。通过上述技术方案,实现了零耦合地客户化类文件的动态加载。
Description
技术领域
本发明涉及JAVA技术领域,具体地,涉及一种实现软件产品客户化的方法及设备。
背景技术
在软件开发过程中,软件开发企业总是倾向于产品化的开发方法,这样可以有效减少开发测试的时间,降低开发成本,加快开发速度。但软件产品应用于具体的客户时,并不能完全满足客户的要求,客户总是会提出各种个性化的需求。为了实现客户化需求,在一般的开发方案中一般有如下的解决办法:
(1)对于需要客户化的部分复制出多个版本,然后通过配置参数来解决不同客户的需要,同时还能只维护一个产品序列。这种方法往往随着客户的增加使产品代码的复杂性成倍增加。
(2)通过良好的设计模式,在设计产品时尽可能的考虑客户的各种需求,引导客户采用自己的方式来实现。这种方法要求软件企业对领域模型具备非常强的理解。
另外,在基于类似HIBERNATE的框架开发时,类似数据库映射的文件不容易被动态替换。
发明内容
本发明的目的是提供一种实现软件产品客户化的方法及设备,其可实现软件产品零耦合地客户化。
为了实现上述目的,本发明提供一种实现软件产品客户化的方法,该方法包括:接收对第一包内的一类文件进行加载的请求;以及在客户包内搜索所述类文件,并执行以下操作中的至少一者:如果所述客户包内不存在所述类文件,则使用所述第一包内的类文件创建类对象;及如果所述客户包内存在所述类文件,则判断该类文件是否支持动态代理,如果支持,则使用该类文件创建动态代理类文件,并使用该动态代理类文件创建类对象;及如果不支持,则对该类文件进行字节码级的签名修改,并使用修改之后的类文件创建类对象。
相应地,本发明还提供一种实现软件产品客户化的设备,该设备包括:接收装置,用于接收对第一包内的一类文件进行加载的请求;以及类加载器,用于在客户包内搜索所述类文件,并执行以下操作中的至少一者:如果所述客户包内不存在所述类文件,则使用所述第一包内的类文件创建类对象;及如果所述客户包内存在所述类文件,则判断该类文件是否支持动态代理,如果支持,则使用该类文件创建动态代理类文件,并使用该动态代理类文件创建类对象;及如果不支持,则对该类文件进行字节码级的签名修改,并使用修改之后的类文件创建类对象。
通过上述技术方案,对软件产品的类文件加载过程进行监控,在加载类文件时,检查该类文件是否存在对应的客户化类文件,如果存在,则通过动态代理机制或动态更改类字节码的方式来替换软件产品的类文件,实现客户化类文件的加载。藉此,软件产品中的其他类并不知道某个类文件是从其他客户包中引入的,从而实现了零耦合地客户化类文件的动态加载。
本发明的其他特征和优点将在随后的具体实施方式部分予以详细说明。
附图说明
附图是用来提供对本发明的进一步理解,并且构成说明书的一部分,与下面的具体实施方式一起用于解释本发明,但并不构成对本发明的限制。在附图中:
图1为本发明提供的实现软件产品客户化的方法的流程图;以及
图2为本发明提供的实现软件产品客户化的方法的另一实施方式的流程图。
具体实施方式
以下结合附图对本发明的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本发明,并不用于限制本发明。
图1为本发明提供的实现软件产品客户化的方法的流程图。如图1所示,本发明提供了一种实现软件产品客户化的方法,该方法包括:接收对第一包内的一类文件进行加载的请求;以及在客户包内搜索所述类文件,并执行以下操作中的至少一者:如果所述客户包内不存在所述类文件,则使用所述第一包内的类文件创建类对象;及如果所述客户包内存在所述类文件,则判断该类文件是否支持动态代理,如果支持,则使用该类文件创建动态代理类文件,并使用该动态代理类文件创建类对象;及如果不支持,则对该类文件进行字节码级的签名修改,并使用修改之后的类文件创建类对象。藉此,可实现零耦合地客户化类文件的动态加载。
为便于理解,以下以具体实施情形为例进行说明。首先,JAVA虚拟机请求类加载器加载A包下的类文件A1.class。类加载器首先在客户包custom.A下搜索所述类文件A1.class。如果没有在客户包custom.A下搜素到类文件A1.class,则直接使用A包下的类文件A1.class来创建类对象;如果在客户包custom.A下搜索到类文件A1.class,则获取该类文件A1.class的内容,并判断该类文件A1.class是否支持动态代理。如果支持动态代理,则使用该类文件A1.class创建动态代理类文件(该动态代理类文件的方法定义都直接调用客户包custom.A下的类文件A1.class中的方法),之后使用该动态代理类文件创建类对象;如果客户包custom.A下的类文件A1.class不支持动态代理,则对该类文件A1.class进行字节码级的签名修改(该修改包括对所述类文件中的类、方法、实例变量、局部变量的签名进行修改),以符合A包下的类文件A1.class的签名要求,之后使用修改后的类文件创建类对象。
图2为本发明提供的实现软件产品客户化的方法的另一实施方式的流程图(为清楚表示,图2仅示出了有关作为非类文件的资源文件加载的流程,而并未示出图1所示的类文件加载的流程)。如图2所示,所述方法还包括:接收对第二包内的一资源文件进行加载的请求;以及于所述客户包内搜索所述资源文件,并执行以下操作中的至少一者:如果所述客户包内不存在所述资源文件,则加载所述第二包内的资源文件;以及如果所述客户包内存在所述资源文件,则加载所述客户包内的资源文件。藉此,可实现对零耦合地客户化资源文件的动态加载。
为便于理解,以下以具体实施情形为例进行说明。首先,JAVA虚拟机请求类加载器加载A包下的资源文件B。类加载器首先在客户包custom.A下搜索所述资源文件B。如果没有在客户包custom.A下搜索到资源文件B,则直接加载A包下的资源文件B;如果在客户包custom.A下搜索到资源文件B,则获取该资源文件B的内容,并加载该资源文件B。
假设一个酒店管理系统产品定义了酒店管理的通用的领域模型,酒店A在应用这个软件产品之后要求要求在酒店客户信息中增加一个特殊的信息项,而这个特殊的信息项只是一个特殊的需求,并不能在产品中包含。此时,可以为这个酒店专门创建客户化的java项目。假设酒店管理系统产品中的客户化信息模型类为com.company.hotel.model.Customer.java,使用了com.company.hotel.model.Customer.hbm.xml数据库映射文件,则这个项目下需要增加如下两个文件:
(1)custom.com.company.hotel.model.Customer.java,这个文件在com.company.hotel.model.Customer.java的基础上增加了所述特殊的信息项;以及
(2)custom.com.company.hotel.model.Customer.hbm.xml数据库映射文件,这个文件在com.company.hotel.model.Customer.hbm.xml数据库映射文件的基础上增加了所述特殊的信息项。
通过这种简单的扩展即可实现了这个酒店的特殊需求。而且,这种客户化的过程并没有对酒店管理产品做任何修改,只需要把客户化的java项目打包放在产品的类路径下即可生效。
相应地,本发明还提供了一种实现软件产品客户化的设备,该设备包括:接收装置,用于接收对第一包内的一类文件进行加载的请求;以及类加载器,用于在客户包内搜索所述类文件,并执行以下操作中的至少一者:如果所述客户包内不存在所述类文件,则使用所述第一包内的类文件创建类对象;及如果所述客户包内存在所述类文件,则判断该类文件是否支持动态代理,如果支持,则使用该类文件创建动态代理类文件,并使用该动态代理类文件创建类对象;及如果不支持,则对该类文件进行字节码级的签名修改,并使用修改之后的类文件创建类对象。
其中,所述对类文件进行字节码级的签名修改包括对所述类文件中的类、方法、实例变量、局部变量的签名进行修改。
其中,所述接收装置还用于接收对第二包内的一资源文件进行加载的请求;以及所述类加载器还于所述客户包内搜索所述资源文件,并执行以下操作中的至少一者:如果所述客户包内不存在所述资源文件,则加载所述第二包内的资源文件;以及如果所述客户包内存在所述资源文件,则加载所述客户包内的资源文件。
通过上述技术方案,软件产品中的其他类并不知道某个类文件或资源文件是从其他客户包中引入的,从而实现了零耦合地客户化类文件或资源文件的动态加载。
以上结合附图详细描述了本发明的优选实施方式,但是,本发明并不限于上述实施方式中的具体细节,在本发明的技术构思范围内,可以对本发明的技术方案进行多种简单变型,这些简单变型均属于本发明的保护范围。
另外需要说明的是,在上述具体实施方式中所描述的各个具体技术特征,在不矛盾的情况下,可以通过任何合适的方式进行组合。为了避免不必要的重复,本发明对各种可能的组合方式不再另行说明。
此外,本发明的各种不同的实施方式之间也可以进行任意组合,只要其不违背本发明的思想,其同样应当视为本发明所公开的内容。
Claims (6)
1.一种实现软件产品客户化的方法,该方法包括:
接收对第一包内的一类文件进行加载的请求;以及
在客户包内搜索所述类文件,并执行以下操作中的至少一者:
如果所述客户包内不存在所述类文件,则使用所述第一包内的类文件创建类对象;及
如果所述客户包内存在所述类文件,则判断该类文件是否支持动态代理,
如果支持,则使用该类文件创建动态代理类文件,并使用该动态代理类文件创建类对象;及
如果不支持,则对该类文件进行字节码级的签名修改,并使用修改之后的类文件创建类对象。
2.根据权利要求1所述的方法,其中,所述对类文件进行字节码级的签名修改包括对所述类文件中的类、方法、实例变量、局部变量的签名进行修改。
3.根据权利要求1或2所述的方法,其中,所述方法还包括:
接收对第二包内的一资源文件进行加载的请求;以及
在所述客户包内搜索所述资源文件,并执行以下操作中的至少一者:
如果所述客户包内不存在所述资源文件,则加载所述第二包内的资源文件;以及
如果所述客户包内存在所述资源文件,则加载所述客户包内的资源文件。
4.一种实现软件产品客户化的设备,该设备包括:
接收装置,用于接收对第一包内的一类文件进行加载的请求;以及
类加载器,用于在客户包内搜索所述类文件,并执行以下操作中的至少一者:
如果所述客户包内不存在所述类文件,则使用所述第一包内的类文件创建类对象;及
如果所述客户包内存在所述类文件,则判断该类文件是否支持动态代理,
如果支持,则使用该类文件创建动态代理类文件,并使用该动态代理类文件创建类对象;及
如果不支持,则对该类文件进行字节码级的签名修改,并使用修改之后的类文件创建类对象。
5.根据权利要求4所述的设备,其中,所述对类文件进行字节码级的签名修改包括对所述类文件中的类、方法、实例变量、局部变量的签名进行修改。
6.根据权利要求4或5所述的设备,其中,
所述接收装置还用于接收对第二包内的一资源文件进行加载的请求;以及
所述类加载器还用于在所述客户包内搜索所述资源文件,并执行以下操作中的至少一者:
如果所述客户包内不存在所述资源文件,则加载所述第二包内的资源文件;以及
如果所述客户包内存在所述资源文件,则加载所述客户包内的资源文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110436019.7A CN103176781B (zh) | 2011-12-22 | 2011-12-22 | 一种实现软件产品客户化的方法及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110436019.7A CN103176781B (zh) | 2011-12-22 | 2011-12-22 | 一种实现软件产品客户化的方法及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103176781A CN103176781A (zh) | 2013-06-26 |
CN103176781B true CN103176781B (zh) | 2016-03-16 |
Family
ID=48636688
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110436019.7A Active CN103176781B (zh) | 2011-12-22 | 2011-12-22 | 一种实现软件产品客户化的方法及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103176781B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6584612B1 (en) * | 1999-07-15 | 2003-06-24 | International Business Machines Corporation | Transparent loading of resources from read-only memory for an application program |
CN1781077A (zh) * | 2003-04-29 | 2006-05-31 | 索尼爱立信移动通讯股份有限公司 | 选择性地加载用于在Java微型设备中调试Java应用程序的远程类或资源 |
CN101520733A (zh) * | 2008-02-27 | 2009-09-02 | 国际商业机器公司 | 装载类的方法和装置及重组类存档文件方法 |
-
2011
- 2011-12-22 CN CN201110436019.7A patent/CN103176781B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6584612B1 (en) * | 1999-07-15 | 2003-06-24 | International Business Machines Corporation | Transparent loading of resources from read-only memory for an application program |
CN1781077A (zh) * | 2003-04-29 | 2006-05-31 | 索尼爱立信移动通讯股份有限公司 | 选择性地加载用于在Java微型设备中调试Java应用程序的远程类或资源 |
CN101520733A (zh) * | 2008-02-27 | 2009-09-02 | 国际商业机器公司 | 装载类的方法和装置及重组类存档文件方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103176781A (zh) | 2013-06-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP2593866B1 (en) | Method and apparatus for distributing computation closures | |
CN111290753B (zh) | 前端开发环境的搭建方法、装置、设备及存储介质 | |
US8407351B2 (en) | Method and apparatus for ensuring transport of user agent information | |
US8407238B2 (en) | System and methods for enabling arbitrary developer code consumption of web-based data | |
US8972489B2 (en) | Providing a client interface for a server-based web application programming interface | |
US20170249177A1 (en) | Extending user interface of a web console | |
CN106339237B (zh) | 针对JavaEE领域WEB应用的插件加载框架及方法 | |
US20130103734A1 (en) | Method and apparatus for providing standard information processing pipelines | |
WO2009043037A4 (en) | Network operating system | |
CN103077024B (zh) | 一种支持SaaS应用流程按需定制与运行的装置及方法 | |
WO2016011883A1 (zh) | 数据资源的获取方法、装置和系统 | |
EP2778968B1 (en) | Mobile telecommunication device remote access to cloud-based or virtualized database systems | |
US20130326487A1 (en) | Emulating cloud functioning of applications locally | |
US9311068B2 (en) | Deployment of web application archives as a preprocessing step for provisioning | |
CN108491236A (zh) | 一种插件加载方法、装置及计算机可读存储介质 | |
CN111638923B (zh) | 一种基于Java注解进行数据路由的方法和装置 | |
US20170017669A1 (en) | Database integration of originally decoupled components | |
WO2009069864A1 (en) | System and method for operating domain profile using database in core framework for sdr mobile terminals | |
CN110058864A (zh) | 微服务的部署方法及装置 | |
CN109522042A (zh) | 一种补丁更新方法、系统及相关组件 | |
US20160028801A1 (en) | Smart redirection and loop detection mechanism for live upgrade large-scale web clusters | |
CN104714812A (zh) | 在云环境中快速部署和加载Java应用的方法和系统 | |
CN105072211A (zh) | 基于dns的域名部署系统及方法 | |
O'Sullivan et al. | The cloud personal assistant for providing services to mobile clients | |
CN103176781B (zh) | 一种实现软件产品客户化的方法及设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |