一种 Java 程序的运行方法及电子终端 【技术领域】
本发明涉及电子通信领域, 尤其涉及一种 Java 程序的运行方法及电子终端。背景技术 随着 Java 语言的普及和应用, 越来越多的软件使用 Java 进行实现。由于 Java 语 言的动态性和灵活性, 对其源代码的保护变得十分困难。
现有技术中, 借助于反编译可以很容易地将源代码从其二进制类文件中提取出 来, 因此, 任何一个恶意用户都可以利用反编译工具, 如 Jad( 应用程序开发联系会议 ) 等工 具对软件进行逆向工程攻击, 可以破解商业软件中授权保护的程序段进而随意分发未经授 权的拷贝。而对于经验丰富的攻击者而言, 甚至不用反编译而直接修改二进制的字节码来 进行攻击, 获取源代码。
如何更好地保护软件的知识产权, 保护软件的源代码不被攻击而泄露成为一个亟 需解决的问题。
发明内容 本发明实施例所要解决的技术问题在于, 提供一种 Java 程序的运行方法及电子 终端。从二进制级别上确保 Java 字节码的安全, 实现了更好地保护软件核心算法和商业机 密不被窃取。
为了解决上述技术问题, 本发明实施例提供了一种 Java 程序的运行方法, 包括 :
启动当前 Java 虚拟机 (JavaVM, Java Virtual Machine), 加载基于 Java 虚拟机 工具接口的动态链接库文件 ;
根据所述动态链接库文件识别当前 Java 虚拟机是否含有预设的标识信息 ;
当识别结果为是时, 正常启动所述 Java 虚拟机运行 Java 程序 ; 当识别结果为否 时, 退出启动程序。
其中, 所述启动当前 Java 虚拟机的步骤之前还包括初始化 Java 虚拟机 ;
所述初始化 Java 虚拟机的步骤包括启动预设的 Java 启动器, 设置 Java 虚拟机的 标识信息。
其中, 所述启动当前 Java 虚拟机的步骤之前还包括 :
基于高级加密标准 AES(AES, Advanced Encryption Standard) 加密算法, 对 Java 程序的 class 文件进行加密。
其中, 所述正常启动所述 Java 虚拟机运行 Java 程序的步骤包括 :
所述 Java 虚拟机检测所述动态链接库文件是否含有预设的标识特征信息 ;
当检测结果为是时, 根据所述动态链接库文件处理 class 文件 ; 当检测结果为否 时, 退出运行程序。
其中, 含有预设的标识特征信息的动态链接库文件设有对所述 class 文件进行解 密的解密密钥 ;
所述 Java 虚拟机根据所述动态链接库文件处理 class 文件的步骤包括 :
所述 Java 虚拟机根据所述动态链接库文件的解密密钥, 调用 AES 算法对所述 class 文件进行解密, 并根据解密后的 class 文件执行指令。
对应地, 本发明实施例还提供了一种电子终端, 包括 :
Java 虚拟机启动模块, 用于启动当前 Java 虚拟机 ;
加载模块, 用于加载基于 Java 虚拟机工具接口的动态链接库文件 ;
标识识别模块, 用于根据所述动态链接库文件识别当前 Java 虚拟机是否含有预 设的标识信息 ;
识别处理模块, 用于当所述标识识别模块的识别结果为是时, 正常启动所述 Java 虚拟机运行 Java 程序 ; 当所述标识识别模块的识别结果为否时, 退出启动程序。
其中, 所述电子终端还包括 :
虚拟机初始化模块, 用于初始化 Java 虚拟机 ;
所述虚拟机初始化模块启动电子终端预设的 Java 启动器, 设置 Java 虚拟机的标 识信息。
其中, 所述电子终端还包括 :
加密模块, 用于基于高级加密标准 AES 加密算法, 对 Java 程序的 class 文件进行 加密。
其中, 所述识别处理模块包括 :
触发检测单元, 用于当所述标识识别模块的识别结果为是时, 触发所述 Java 虚拟 机检测所述动态链接库文件是否含有预设的标识特征信息 ;
当所述检测结果为是时, 所述 Java 虚拟机根据所述动态链接库文件处理 class 文 件; 当所述检测结果为否时, 所述 Java 虚拟机退出运行程序。
其中, 含有预设的标识特征信息的动态链接库文件设有对所述 class 文件进行解 密的解密密钥 ;
当所述检测结果为是时, 所述 Java 虚拟机根据所述动态链接库文件的解密密钥, 调用 AES 算法对所述 class 文件进行解密, 并根据解密后的 class 文件执行指令。
实施本发明实施例, 具有如下有益效果 :
通过识别当前 Java 虚拟机是否含有预设的标识信息, 当识别出当前的 Java 虚拟 机含有预设的标识信息时才正常启动所述 Java 虚拟机运行 Java 程序, 且该 Java 虚拟机还 检测所述动态链接库文件是否含有预设的标识特征信息, 当检测到该动态链接库文件含有 预设的标识特征信息时才根据所述动态链接库文件处理 class 文件, 否则退出运行程序, 实现了从二进制级别上确保 Java 字节码的安全, 让攻击者无法取得字节码, 从而从根本 上保护商业软件的源代码不被窃取, 更加安全的保护了商业软件的核心算法和商业机密 ; 采用本发明的技术方案不会损失任何 Java 的特性, 可以实现跨平台 Java 字节码的保护 ; 采用运行期面向切面编程 (AOP, Aspect Oriented Programming) 外挂方式装载, 对现有 的 Java 软件系统没有任何侵入影响 ; 由于控制在 Java 虚拟机级别上, 对 java 平台标准版 (JavaSE) 与 java 平台企业版 (JavaEE) 环境都是通用的, 并且部署简单, 成本低。附图说明 为了更清楚地说明本发明实施例或现有技术中的技术方案, 下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍, 显而易见地, 下面描述中的附图仅仅是本 发明的一些实施例, 对于本领域普通技术人员来讲, 在不付出创造性劳动性的前提下, 还可 以根据这些附图获得其他的附图。
图 1 是本发明 Java 程序的运行方法的第一实施例流程示意图 ;
图 2 是本发明 Java 程序的运行方法的第二实施例流程示意图 ;
图 3 是本发明电子终端的第一实施例的结构示意图 ;
图 4 是本发明电子终端的第二实施例的结构示意图 ;
图 5 是本发明电子终端的第三实施例的结构示意图 ;
图 6 是本发明电子终端的第四实施例的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图, 对本发明实施例中的技术方案进行清楚、 完 整地描述, 显然, 所描述的实施例仅仅是本发明一部分实施例, 而不是全部的实施例。基于 本发明中的实施例, 本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他 实施例, 都属于本发明保护的范围。
如图 1 示出的本发明 Java 程序的运行方法的第一实施例流程示意图, 包括 : 步骤 S101 : 启动当前 Java 虚拟机, 加载基于 Java 虚拟机工具接口的动态链接库文件 ; 具体地, 用户需要运行 Java 程序, 向电子终端发送运行 Java 程序的指令, 电子终 端接收到该指令后, 启动当前 Java 虚拟机, 并加载基于 Java 虚拟机工具接口 (JVMTI, Java Virtual Machine Tool Interface) 的动态链接库文件 ; 该 Java 虚拟机可以为用户安装 的 Java 虚拟机, 也可以电子终端本身自带的 Java 虚拟机 ; 该动态链接库文件可以为基于 windows 平台的 DLL 组件 ( 如 Agent.dll), 也可以为基于 Linux 平台的 SO 组件等等。
步骤 S102 : 根据所述动态链接库文件识别当前 Java 虚拟机是否含有预设的标识 信息 ;
具体地, 当识别结果为是时, 则执行步骤 S103 ; 当识别结果为否时, 则退出启动程 序, 结束流程。
步骤 S103 : 正常启动所述 Java 虚拟机运行 Java 程序。
需要说明的是, 本发明实施例还包括, 技术人员编写完毕 Java 程序后, 首先初始 化 Java 虚拟机, 预先设置 Java 虚拟机的标识信息, 具体地 : 技术人员定制 Java 启动器, 采 用 C 语言修改 Java.c 源文件, 以通过启动该定制的 Java 启动器, 在首次初始化 Java 虚拟 机的过程中给 Java 虚拟机预先设置标识信息, 下面列举一个初始化 Java 虚拟机, 设置 Java 虚拟机的标识信息的例子, 但不限于如下的形式 :
/*
*Initializes the Java Virtual Machine.Also frees options array when
*finished.
*/
static jboolean InitializeJVM(JavaVM**pvm, JNIEnv**penv, InvocationFunctions*ifn){ JavaVMInitArgs args ; jint r ; memset(&args, 0, sizeof(args)) ; args.version = JNI_VERSION_1_2 ; args.nOptions = numOptions ; args.options = options ; args.ignoreUnrecognized = JNI_FALSE ; if(_launcher_debug){ int i = 0 ; printf(″ JavaVM args:\n ″ ) ; printf(″ version 0x% 08lx,″, (long)args.version) ; printf(″ ignoreUnrecognized is% s,″, args.ignoreUnrecognized ?″ JNI_TRUE″ : ″ JNI_FALSE″ ) ; printf(″ nOptions is% ld\n″, (long)args.nOptions) ; for(i = 0 ; i < numOptions ; i++) printf(″ option[% 2d] =′% s′ \n″, i, args.options[i].optionString) ; } // 设置 JavaVM 的标识信息, 该标识信息包括但不限于一个为 “123456” 的序列号等等 : pvm- > reserved0 =″ 123456″ ;
r = ifn- > CreateJavaVM(pvm, (void**)penv, &args) ;
JLI_MemFree(options) ;
return r == JNI_OK ;
}
那么在步骤 S102 中, 电子终端根据所述动态链接库文件识别当前 Java 虚拟机是 否含有预设的标识信息 (123456 的序列号 ), 若识别出当前 Java 虚拟机没有含有该序列号, 表明当前 Java 虚拟机没有权利运行 Java 程序, 为非法操作, 退出启动程序, 结束流程 ; 若识 别出当前 Java 虚拟机含有该序列号, 表明当前 Java 虚拟机为用户授权的 Java 虚拟机, 有 权利运行 Java 程序, 则执行步骤 S103, 正常启动所述 Java 虚拟机运行 Java 程序。具体地, 技术人员预先定制所述动态链接库文件 ( 如 Agent.dll), 采用 C 语言按 JVMTI 规范编写的 dll 文件, 以识别当前 Java 虚拟机是否含有预设的标识信息, 下面列举一个根据按 JVMTI 规 范编写的 dll 文件识别当前 Java 虚拟机是否含有预设的标识信息的例子, 但不限于如下的 形式 :
/*Agent_OnLoad : This is called immediately after the shared library is
* loaded.This is the first code executed.
*/
JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM*vm, char*options, void*reserved){
// 检测 JavaVM 的序列号, 如果不一致就直接返回
if(strcmp((*vm)- > reserved0,″ 123456″ ) != 0)
{
return JNI_OK ;
}
// 如果一致, 则执行步骤 S103 正常启动所述 Java 虚拟机运行 Java 程序
现有技术中, 由于任何平台上的 Java 虚拟机呈现的总是相同的指令, 而 Java 的指 令系统就注定了反编译的可行性以及容易性。当前流行的源码攻击与字节码攻击技术, 这 些攻击手段都有一个共同的前提 : 首先能通过 Java 虚拟机获取到字节码, 然后反编译成源 码进行攻击或直接攻击字节码。采用本发明提供的技术方案, 通过检测 Java 虚拟机是否具 有预设的标识信息, 让攻击者无法接触到字节码, 从而破坏了攻击者获取字节码的前提, 从 根本上解决现有技术中通过 Java 虚拟机可以获取并攻击字节码的安全破绽, 达到保护核 心 Java 程序代码的目的。
进一步地, 本发明实施例还包括 : 技术人员编写完毕 Java 程序后, 执行步骤 S101 之前, 将基于高级加密标准 AES 加密算法, 对 Java 程序的 class 文件进行加密, 得到 class 文件的密文。
下面结合图 2 示出的本发明 Java 程序的运行方法的第二实施例流程示意图, 包 步骤 S201 : 启动当前 Java 虚拟机, 加载基于 Java 虚拟机工具接口的动态链接库 具体地, 如上述第一实施例的步骤 S101, 这里不再赘述。 步骤 S202 : 根据所述动态链接库文件识别当前 Java 虚拟机是否含有预设的标识括:
文件 ;
信息 ; 具体地, 如上述第一实施例的步骤 S202, , 当识别结果为是时, 则执行步骤 S203 ; 当识别结果为否时, 则退出启动程序, 结束流程。
步骤 S203 : 所述 Java 虚拟机检测所述动态链接库文件是否含有预设的标识特征 信息 ;
具体地, 下面列举 Java 虚拟机检测所述动态链接库文件是否含有预设的标识特 征信息的示例, 但不限于如下代码示例 :
/*
*JVM would like to know if it′ s created by a standard Sun launcher, or by
*user native application, the following property indicates the former.
*/
void SetJavaLauncherProp(){
AddOption(″ -Dsun.java.launcher = SUN_STANDARD″, NULL) ;
//TODO 强制开启 JVMTI 代理
//-agentpath:E:/jdbcTracker.dll = bootJar = E:/jdbcTracker.jar
//AddOption(″ -agentpath:E:/jdbcTracker.dll = bootJar = E:/jdbcTracker.jar″, NULL
);AddOption(″ -agentlib:Agent″, NULL) ;
}
如, 预设的动态链接库文件为 Agent.dll, 那么在 Java 虚拟机 (JVM) 的启动代码中 已经绑定了我们预设的 Agent 来伴随启动, 通过 Agent 的名称 ( 相当于标识特征信息 ) 指 定了我们要在启动过程中加载 Agent.dll, 若成功加载 Agent.dll, 即步骤 S203 的检测结果 为是, 若没有成功加载 Agent.dll, 即步骤 S203 的检测结果为否。
具体地, 当检测结果为是时, 则执行步骤 S204 ; 当检测结果为否时, 退出运行程 序; 现有技术中攻击者可以运用 JVMTI 技术, 通过监听 ClassFileLoadHook 事件来截取到解 密后的 Class 字节码 ; 本发明实施例中技术人员预先设置动态链接库文件含有标识特征信 息 ( 如特征码信息等 ), 只有当 Java 虚拟机检测到该动态链接库文件含有该标识特征信息 才进行后续的运行处理, 表明 Java 虚拟机检测到攻击者使用的动态链接库文件没有含有 预设的标识特征信息时, 则运行程序, 从而杜绝了攻击者注入的任何外挂代码, 能更好地保 护 Java 程序代码。
步骤 S204 : 根据所述动态链接库文件处理 class 文件。
具体地, 含有预设的标识特征信息的动态链接库文件设有对所述 class 文件进行 解密的解密密钥, 所述 Java 虚拟机根据所述动态链接库文件的解密密钥, 调用 AES 算法对 所述 class 文件进行解密, 并根据解密后的 class 文件执行指令。因此, 攻击者若没有技术 人员预设的含有标识特征信息的动态链接库文件, 无法对所述 class 文件进行解密。如下 面列举的当根据按 JVMTI 规范编写的 dll 文件识别当前 Java 虚拟机含有预设的标识信息 后, 根据所述动态链接库文件的解密密钥, 调用 AES 算法对所述 class 文件进行解密例子, , 但不限于如下的形式 :
/*Agent_OnLoad : This is called immediately after the shared library is
* loaded.This is the first code executed.
*/
JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM*vm, char*options, void*reserved){
// 检测 JavaVM 的序列号, 如果不一致就直接返回
if(strcmp((*vm)- > reserved0,″ 123456″ ) != 0)
{
return JNI_OK ;
}
static GlobalAgentData data ;
jvmtiEnv*jvmti ;
jvmtiError error ;
jint res ;
TraceFlavor flavor ;
jvmtiCapabilities capabilities ;
jvmtiEventCallbacks callbacks ;static Trace empty ; // 内存初始化 (void)memset((void*)&data, 0, sizeof(data)) ; gdata = &data ; /* 获取 JVMTI 环境 */ res = (*vm)- > GetEnv(vm, (void**)&jvmti, JVMTI_VERSION_1) ; if(res != JNI_OK){ fatal_error(″ ERROR : Unable to access JVMTI Version 1(0x% x), ″ ″ is your JDK a 5.0or newer version ?″ ″ JNIEnv′ s GetEnv()returned% d\n″, JVMTI_VERSION_1, res) ; } //...... 调用标准 AES 算法解密过程省略 // return JNI_OK ;}
需要说明的是, 本发明实施例中以 Agent.dll 进行 class 文件的解密, 这个解密只 影响了那些被加密保护的 class 文件, 对于那些没用加密的 class 文件也照样能够在 Java 虚拟机环境中运行 ; 即本发明提供的保护环境并不是私自专用的环境, 对于一些在 java 平 台企业版 (JavaEE) 服务器中运行的程序来说, 往往需要一个 Java 虚拟机来启动的, 而本发 明实施例采用运行期面向切面编程 (AOP, Aspect Oriented Programming) 外挂方式装载, 加上 Agent.dll 就可以处理加密的 class 文件, 我们移除 Agent.dll 的话, 也并没有削弱处 理普通没加密的 class 的能力, 因此现有的 Java 软件系统没有任何侵入影响。
通过上述实施例, 电子终端识别当前 Java 虚拟机是否含有预设的标识信息, 当识 别出当前的 Java 虚拟机含有预设的标识信息时才正常启动所述 Java 虚拟机运行 Java 程 序, 且该 Java 虚拟机还检测所述动态链接库文件是否含有预设的标识特征信息, 当检测到 该动态链接库文件含有预设的标识特征信息时才根据所述动态链接库文件处理 class 文 件, 否则退出运行程序, 实现了从二进制级别上确保 Java 字节码的安全, 让攻击者无法取 得字节码, 从而从根本上保护商业软件的源代码不被窃取, 更加安全的保护了商业软件的 核心算法和商业机密 ; 采用本发明的技术方案不会损失任何 Java 的特性, 可以实现跨平台 Java 字节码的保护 ; 采用运行期面向切面编程 (AOP, Aspect Oriented Programming) 外挂 方式装载, 对现有的 Java 软件系统没有任何侵入影响 ; 由于控制在 Java 虚拟机级别上, 对 java 平台标准版 (JavaSE) 与 java 平台企业版 (JavaEE) 环境都是通用的, 并且部署简单, 成本低。
上面详细说明了本发明实施例的 Java 程序的运行方法, 下面对应地, 详细说明本 发明实施例的电子终端。
如图 3 示出的本发明电子终端的第一实施例的结构示意图, 电子终端 3 包括 Java 虚拟机启动模块 31、 加载模块 32、 标识识别模块 33 以及识别处理模块 34, 其中
Java 虚拟机启动模块 31 用于启动当前 Java 虚拟机 ;
加载模块 32 用于加载基于 Java 虚拟机工具接口的动态链接库文件 ;
具体地, 用户需要运行 Java 程序, 向电子终端 3 发送运行 Java 程序的指令, 电子终端 3 接收到该指令后, Java 虚拟机启动模块 31 启动当前 Java 虚拟机, 加载模块 32 加载 基于 Java 虚拟机工具接口 (JVMTI, Java Virtual Machine Tool Interface) 的动态链接 库文件 ; 该 Java 虚拟机可以为用户安装的 Java 虚拟机, 也可以电子终端本身自带的 Java 虚拟机 ; 该动态链接库文件可以为基于 windows 平台的 DLL 组件 ( 如 Agent.dll), 也可以 为基于 Linux 平台的 SO 组件等等。
标识识别模块 33 用于根据所述动态链接库文件识别当前 Java 虚拟机是否含有预 设的标识信息 ;
识别处理模块 34 用于当标识识别模块 33 的识别结果为是时, 正常启动所述 Java 虚拟机运行 Java 程序 ; 当标识识别模块 33 的识别结果为否时, 退出启动程序。
进一步地, 如图 4 示出的本发明电子终端的第二实施例的结构示意图, 电子终端 3 包括 Java 虚拟机启动模块 31、 加载模块 32、 标识识别模块 33 以及识别处理模块 34 外, 还 包括虚拟机初始化模块 35, 虚拟机初始化模块 35 用于初始化 Java 虚拟机 ; 具体地,
技术人员编写完毕 Java 程序后, 首先通过虚拟机初始化模块 35 初始化 Java 虚拟 机, 预先设置 Java 虚拟机的标识信息, 具体地 : 技术人员定制一个 Java 启动器, 采用 C 语 言修改 Java.c 源文件, 虚拟机初始化模块 35 通过启动该定制的 Java 启动器, 在首次初始 化 Java 虚拟机的过程中给 Java 虚拟机预先设置标识信息, 那么后续标识识别模块 33 将根 据所述动态链接库文件识别当前 Java 虚拟机是否含有虚拟机初始化模块 35 预设的标识信 息。 现有技术中, 由于任何平台上的 Java 虚拟机呈现的总是相同的指令, 而 Java 的指 令系统就注定了反编译的可行性以及容易性。当前流行的源码攻击与字节码攻击技术, 这 些攻击手段都有一个共同的前提 : 首先能通过 Java 虚拟机获取到字节码, 然后反编译成源 码进行攻击或直接攻击字节码。采用本发明提供的技术方案, 通过检测 Java 虚拟机是否具 有预设的标识信息, 让攻击者无法接触到字节码, 从而破坏了攻击者获取字节码的前提, 从 根本上解决现有技术中通过 Java 虚拟机可以获取并攻击字节码的安全破绽, 达到保护核 心 Java 程序代码的目的。
再进一步地, 如图 5 示出的本发明电子终端的第三实施例的结构示意图, 电子终 端 3 包括 Java 虚拟机启动模块 31、 加载模块 32、 标识识别模块 33、 识别处理模块 34 以及虚 拟机初始化模块 35 外, 还包括加密模块 36, 用于基于 AES 加密算法, 对 Java 程序的 class 文件进行加密。具体地, 技术人员编写完毕 Java 程序后, Java 虚拟机启动模块 31 启动当 前 Java 虚拟机之前, 将基于高级加密标准 AES 加密算法, 对 Java 程序的 class 文件进行加 密, 得到 class 文件的密文。
再进一步地, 如图 6 示出的本发明电子终端的第四实施例的结构示意图, 电子终 端 3 中的识别处理模块 34 还包括触发检测单元 341, 用于当标识识别模块 33 的识别结果为 是时, 触发所述 Java 虚拟机检测所述动态链接库文件是否含有预设的标识特征信息, 当所 述检测结果为是时, 所述 Java 虚拟机根据所述动态链接库文件处理 class 文件 ; 当所述检 测结果为否时, 所述 Java 虚拟机退出运行程序。现有技术中攻击者可以运用 JVMTI 技术, 通过监听 ClassFileLoadHook 事件来截取到解密后的 Class 字节码 ; 本发明实施例中技术 人员预先设置动态链接库文件含有标识特征信息 ( 如特征码信息等 ), 只有当 Java 虚拟机 检测到该动态链接库文件含有该标识特征信息才进行后续的运行处理, 表明 Java 虚拟机
检测到攻击者使用的动态链接库文件没有含有预设的标识特征信息时, 则运行程序, 从而 杜绝了攻击者注入的任何外挂代码, 能更好地保护 Java 程序代码。
需要说明的是, 含有预设的标识特征信息的动态链接库文件设有对所述 class 文 件进行解密的解密密钥 ; 当所述 Java 虚拟机的检测结果为是时, 所述 Java 虚拟机根据所 述动态链接库文件的解密密钥, 调用 AES 算法对所述 class 文件进行解密, 并根据解密后的 class 文件执行指令。 因此, 攻击者若没有技术人员预设的含有标识特征信息的动态链接库 文件, 无法对所述 class 文件进行解密。
综上所述, 通过识别当前 Java 虚拟机是否含有预设的标识信息, 当识别出当前的 Java 虚拟机含有预设的标识信息时才正常启动所述 Java 虚拟机运行 Java 程序, 且该 Java 虚拟机还检测所述动态链接库文件是否含有预设的标识特征信息, 当检测到该动态链接库 文件含有预设的标识特征信息时才根据所述动态链接库文件处理 class 文件, 否则退出运 行程序, 实现了从二进制级别上确保 Java 字节码的安全, 让攻击者无法取得字节码, 从而 从根本上保护商业软件的源代码不被窃取, 更加安全的保护了商业软件的核心算法和商业 机密 ; 采用本发明的技术方案不会损失任何 Java 的特性, 可以实现跨平台 Java 字节码的保 护; 采用运行期面向切面编程 (AOP, Aspect Oriented Programming) 外挂方式装载, 对现有 的 Java 软件系统没有任何侵入影响 ; 由于控制在 Java 虚拟机级别上, 对 java 平台标准版 (JavaSE) 与 java 平台企业版 (JavaEE) 环境都是通用的, 并且部署简单, 成本低。 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程, 是可以 通过计算机程序来指令相关的硬件来完成, 所述的程序可存储于一计算机可读取存储介质 中, 该程序在执行时, 可包括如上述各方法的实施例的流程。其中, 所述的存储介质可为磁 碟、 光盘、 只读存储记忆体 (Read-Only Memory, ROM) 或随机存储记忆体 (Random Access Memory, RAM) 等。
以上所揭露的仅为本发明一种较佳实施例而已, 当然不能以此来限定本发明之权 利范围, 因此依本发明权利要求所作的等同变化, 仍属本发明所涵盖的范围。