一种基于JSON数据格式描述的Java Bean的动态生成方法转让专利

申请号 : CN202211587536.9

文献号 : CN115586904B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 干鹏宇何旭

申请人 : 云筑信息科技(成都)有限公司

摘要 :

本发明公开了一种基于JSON数据格式描述的Java Bean的动态生成方法,属于大数据技术领域,所述方法包括将JSON字符串作为输入,并使用JSON序列化工具将JSON字符串反序列化为Java对象;对所述Java对象进行输入校正;使用字节码操作工具,构建类属性模型,对输入校正的Java对象进行Java Bean的动态生成。本发明将Java Bean动态生成的逻辑进行高度抽象,避免了将具体某个Java Bean的生成逻辑耦合在代码中而难以维护;同时本发明避免了Java Bean定义变动时需要修改源代码重新启动项目的问题,提高了灵活性。

权利要求 :

1.一种基于JSON数据格式描述的Java Bean的动态生成方法,其特征在于,包括以下步骤:

步骤1、将JSON字符串作为输入,并使用JSON序列化工具将JSON字符串反序列化为Java对象;

步骤2、对所述Java对象进行输入校正;

步骤3、使用字节码操作工具,构建类属性模型,对输入校正的Java对象进行Java Bean的动态生成;

所述步骤3包括:步骤31、基于字节码操作工具,创建Java对象的类属性注解和类属性模型,将类属性注解添加到类属性模型中,并输出类的动态;步骤32、若Java对象中类的编译方式的赋值为假,将类的动态作为Java Bean的动态生成结果;若Java对象中类的编译方式的赋值为真,调用字节码操作工具对类的动态进行编译;当Java对象中类的类加载方式的赋值为假,将进行编译的结果作为Java Bean的动态生成结果,当Java对象中类的类加载方式的赋值为真,对进行编译的结果进行加载并输出字节码对象,将字节码对象作为Java Bean的动态生成结果。

2.根据权利要求1所述的一种基于JSON数据格式描述的Java Bean的动态生成方法,其特征在于,所述步骤2包括:步骤21、没有指定的基础包,则报错并程序中止;步骤22、没有指定的类名,则默认类名的赋值为DynamicBean加上一个随机数;步骤23、没有指定的类加载器,则默认使用当前程序使用的类加载器;步骤24、没有指定的基类,则默认基类的赋值为Object类,有指定的基类,则使用类加载器加载指定的基类,若加载失败则报错并程序中止;步骤25、没有指定的类加载方式,当有指定的类加载器,则默认类加载方式的赋值为真,否则为假;步骤26、没有指定的编译方式,则默认编译方式的赋值为假;步骤27、逐一对Java对象中类的属性定义进行检查。

3.根据权利要求2所述的一种基于JSON数据格式描述的Java Bean的动态生成方法,其特征在于,所述步骤27包括:步骤271、所述Java对象的类没有指定的属性名称或属性类型,则报错并程序中止,若有指定的属性名称和属性类型,则使用类加载器加载所述属性类型,如类加载器加载失败,则报错并程序中止;步骤272、逐一对类中注解的属性定义进行检查。

4.根据权利要求3所述的一种基于JSON数据格式描述的Java Bean的动态生成方法,其特征在于,所述步骤272包括:步骤A:所述类的注解没有指定的注解类型,则报错并程序中止,若有指定的注解类型,使用类加载器加载所述注解类型,如类加载器加载失败,则报错并程序中止;步骤B:逐一对注解配置值中注解的属性定义进行检查:所述注解配置值中的注解没有指定的注解属性名称或注解值,则程序中止。

5.根据权利要求1所述的一种基于JSON数据格式描述的Java Bean的动态生成方法,其特征在于,所述步骤31包括:步骤311、将基类指定为父类,将基础包和类名组合并作为动态生成的类的名称;步骤312、读取Java对象中类的属性定义,依次迭代类,如果当前迭代的类的属性定义存在注解的属性定义,则先迭代注解的属性定义并进行类属性注解的创建;步骤313、使用定义的注解类型创建内置于字节码操作工具的注解定义模型,按照注解配置值中的定义设置注解属性和注解值;步骤314、基于注解的属性定义,创建内置于字节码操作工具的类属性模型,将创建的所有类属性注解添加到类属性模型中,并输出类的动态。

6.根据权利要求5所述的一种基于JSON数据格式描述的Java Bean的动态生成方法,所述步骤314中,使用注解类型指定的类型和注解名称指定的属性名称,创建内置于字节码操作工具的类属性模型。

7.根据权利要求5所述的一种基于JSON数据格式描述的Java Bean的动态生成方法,其特征在于,所述步骤32包括:步骤321、若Java对象中类的编译方式的赋值为假,则返回至类的动态,流程结束;若Java对象中类的编译方式的赋值为真,则调用字节码操作工具的API,对类的动态进行编译;步骤322、若Java对象中类的类加载方式的赋值为假,则返回至类的动态的编译结果,流程结束;若Java对象中类的类加载方式的赋值为真,则使用类加载器加载类的动态的编译结果,并输出字节码对象,流程结束。

8.根据权利要求1所述的一种基于JSON数据格式描述的Java Bean的动态生成方法,其特征在于,所述字节码操作工具为ByteBuddy。

说明书 :

一种基于JSON数据格式描述的Java Bean的动态生成方法

技术领域

[0001] 本发明属于大数据技术领域,具体涉及一种基于JSON数据格式描述的Java Bean的动态生成方法。

背景技术

[0002] Java Bean是使用Java语言开发的一个可重用的组件,在JSP的开发中可以使用Java Bean减少重复代码,使整个JSP代码的开发更简洁。JSP搭配Java Bean来使用,具有以下的优点:一是可将HTML和Java代码分离,这主要是为了日后维护的方便。如果把所有的程序代码(HTML和Java)写到JSP页面中,会使整个程序代码又多又复杂,造成日后维护上的困难。二是可利用Java Bean的优点,将日常用到的程序写成Java Bean组件,当在JSP要使用时,只要调用Java Bean组件来执行用户所要的功能,不用再重复写相同的程序,这样以来也可以节省开发所需的时间。
[0003] 现有技术中,Java Bean的动态生成包括:直接使用各种字节码操作工具(如 ByteBuddy、ASM、Cglib等)进行,或者基于各种自定义DSL(Domain Specific Language)描述类的定义,调用字节码操作工具完成动态类生成。上述第一种方式需要直接将动态生成的实现逻辑耦合在代码中,每生成一种Java Bean就需要编写一套对应的动态生成逻辑;而第二种方式需要用户学习各种DSL的规则,不能实现一份定义,多处可用的便捷。
[0004] 因此,本发明提供了一种基于JSON数据格式描述的Java Bean的动态生成方法,以至少解决上述部分技术问题。

发明内容

[0005] 本发明要解决的技术问题是:提供一种基于JSON数据格式描述的Java Bean的动态生成方法,以至少解决上述部分技术问题。
[0006] 为实现上述目的,本发明采用的技术方案如下:
[0007] 一种基于JSON数据格式描述的Java Bean的动态生成方法,包括以下步骤:
[0008] 步骤1、将JSON字符串作为输入,并使用JSON序列化工具将JSON字符串反序列化为Java对象;
[0009] 步骤2、对所述Java对象进行输入校正;
[0010] 步骤3、使用字节码操作工具,构建类属性模型,对输入校正的Java对象进行Java Bean的动态生成。
[0011] 进一步的,所述步骤2包括:步骤21、没有指定的基础包,则报错并程序中止;步骤22、没有指定的类名,则默认类名的赋值为DynamicBean加上一个随机数;步骤23、没有指定的类加载器,则默认使用当前程序使用的类加载器;步骤24、没有指定的基类,则默认基类的赋值为Object类,有指定的基类,则使用类加载器加载指定的基类,若加载失败则报错并程序中止;步骤25、没有指定的类加载方式,当有指定的类加载器,则默认类加载方式的赋值为真,否则为假;步骤26、没有指定的编译方式,则默认编译方式的赋值为假;步骤27、逐一对Java对象中类的属性定义进行检查。
[0012] 进一步的,所述步骤27包括:步骤271、所述Java对象的类没有指定的属性名称或属性类型,则报错并程序中止,若有指定的属性名称和属性类型,则使用类加载器加载所述属性类型,如类加载器加载失败,则报错并程序中止;步骤272、逐一对类中注解的属性定义进行检查。
[0013] 进一步的,所述步骤272包括:步骤A:所述类的注解没有指定的注解类型,则报错并程序中止,若有指定的注解类型,使用类加载器加载所述注解类型,如类加载器加载失败,则报错并程序中止;步骤B:逐一对注解配置值中注解的属性定义进行检查:所述注解配置值中的注解没有指定的注解属性名称或注解值,则程序中止。
[0014] 进一步的,所述步骤3包括:步骤31、基于字节码操作工具,创建Java对象的类属性注解和类属性模型,将类属性注解添加到类属性模型中,并输出类的动态;步骤32、若Java对象中类的编译方式的赋值为假,将类的动态作为Java Bean的动态生成结果;若Java对象中类的编译方式的赋值为真,调用字节码操作工具对类的动态进行编译;当Java对象中类的类加载方式的赋值为假,将所述编译结果作为Java Bean的动态生成结果,当Java对象中类的类加载方式的赋值为真,对所述编译结果进行加载并输出字节码对象,将字节码对象作为Java Bean的动态生成结果。
[0015] 进一步的,所述步骤31包括:步骤311、将基类指定为父类,将基础包和类名组合并作为动态生成的类的名称;步骤312、读取Java对象中类的属性定义,依次迭代类,如果当前迭代的类的属性定义存在注解的属性定义,则先迭代注解的属性定义并进行类属性注解的创建;步骤313、使用定义的注解类型创建内置于字节码操作工具的注解定义模型,按照注解配置值中的定义设置注解属性和注解值;步骤314、基于注解的属性定义,创建内置于字节码操作工具的类属性模型,将创建的所有类属性注解添加到类属性模型中,并输出类的动态。
[0016] 进一步的,所述步骤314中,使用注解类型指定的类型和注解名称指定的属性名称,创建内置于字节码操作工具的类属性模型。
[0017] 进一步的,所述步骤32包括:步骤321、若Java对象中类的编译方式的赋值为假,则返回至类的动态,流程结束;若Java对象中类的编译方式的赋值为真,则调用字节码操作工具的API,对类的动态进行编译;步骤322、若Java对象中类的类加载方式的赋值为假,则返回至类的动态的编译结果,流程结束;若Java对象中类的类加载方式的赋值为真,则使用类加载器加载类的动态的编译结果,并输出字节码对象,流程结束。
[0018] 进一步的,所述字节码操作工具为ByteBuddy。
[0019] 与现有技术相比,本发明具有以下有益效果:
[0020] 本发明设计科学合理,将Java Bean动态生成的逻辑进行高度抽象,用户只需要按照特定的JSON数据格式来描述Java Bean,程序就可以通过分析JSON来实现Bean的动态生成,避免了将具体某个Java Bean的生成逻辑耦合在代码中而难以维护。本发明使用方便,所需要的JSON数据可以在任意时刻传入程序中,即在程序运行过程中的任意时刻,实时修改动态生成的Java Bean的定义,避免了Java Bean定义变动时需要修改源代码重新启动项目的问题,提高了灵活性。

附图说明

[0021] 图1为本发明方法流程图。

具体实施方式

[0022] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图,对本发明进一步详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0023] 如图1所示,本发明提供的一种基于JSON数据格式描述的Java Bean的动态生成方法,包括以下步骤:
[0024] 步骤1、将JSON字符串作为输入,并使用JSON序列化工具将JSON字符串反序列化为Java对象;
[0025] 步骤2、对所述Java对象进行输入校正;
[0026] 步骤3、使用字节码操作工具,构建类属性模型,对输入校正的Java对象进行Java Bean的动态生成。
[0027] 本发明将Java Bean动态生成的逻辑进行高度抽象,用户只需要按照特定的JSON数据格式来描述Java Bean,程序就可以通过分析JSON来实现Bean的动态生成,避免了将具体某个Java Bean的生成逻辑耦合在代码中而难以维护。用户所需要的JSON数据可以在任意时刻传入程序中,即在程序运行过程中的任意时刻,实时修改动态生成的Java Bean的定义,避免了Java Bean定义变动时需要修改源代码重新启动项目的问题,提高了灵活性。
[0028] 本发明通过构建了特定的JSON数据模型,用来描述一个Java Bean的定义,包括属性名称、属性类型、属性标注的注解,再通过解析所述JSON数据模型,并调用开源的字节码操作工具以此实现Java Bean的动态生成。
[0029] 本发明所述步骤1为JSON字符串的输入和Java对象的转化。将符合JSON数据模型的JSON字符串作为输入,并使用任意JSON序列化工具将所述JSON字符串反序列化为与JSON数据模型一致的Java对象。
[0030] 本发明所述步骤2为Java对象的校正过程。步骤2包括:步骤21、没有指定的基础包(basePackage),则报错并程序中止;步骤22、没有指定的类名(beanName),则默认类名的赋值为DynamicBean加上一个随机数;步骤23、没有指定的类加载器(classloader),则默认使用当前程序使用的类加载器;步骤24、没有指定的基类(baseClass),则默认基类的赋值为Object类(java.lang.Object),有指定的基类,则使用类加载器加载指定的基类,若加载失败则报错并程序中止;步骤25、没有指定的类加载方式(load),当有指定的类加载器,则默认类加载方式的赋值为真(true),否则为假(false);步骤26、没有指定的编译方式(compile),则默认编译方式的赋值为假(false);步骤27、逐一对Java对象中类(fields)的属性定义进行检查。
[0031] 所述步骤27包括:步骤271、所述Java对象的类(fields)可以不包含任何属性定义,若包含有属性定义时:类没有指定的属性名称(name)或属性类型(type),则报错并程序中止,若有指定的属性名称(name)和属性类型(name),则使用类加载器(classloader)加载所述属性类型(type),如类加载器加载失败,则报错并程序中止;步骤272、逐一对类中注解(annotations)的属性定义进行检查。
[0032] 所述步骤272包括:步骤A:所述类的注解没有指定的注解类型(type),则报错并程序中止,若有指定的注解类型(type),则使用类加载器(classloader)加载所述注解类型(type),如类加载器加载失败,则报错并程序中止;步骤B:逐一对注解配置值(properties)中注解的属性定义进行检查:所述注解配置值(properties)可以不包含任何属性定义,若包含有属性定义时:注解配置值(properties)中的注解没有指定的注解属性名称(name)或注解值(value),则程序中止。
[0033] 本发明所述步骤3为JSON数据模型的构建与解析,并调用字节码操作工具动态生成Java Bean。包括:步骤31、基于字节码操作工具,创建Java对象的类属性注解和类属性模型,将类属性注解添加到类属性模型中,并输出类的动态;步骤32、若Java对象中类的编译方式的赋值为假,将类的动态作为Java Bean的动态生成结果;若Java对象中类的编译方式的赋值为真,调用字节码操作工具对类的动态进行编译;当Java对象中类的类加载方式的赋值为假,将所述编译结果作为Java Bean的动态生成结果,当Java对象中类的类加载方式的赋值为真,对所述编译结果进行加载并输出字节码对象,将字节码对象作为Java Bean的动态生成结果。
[0034] 步骤31包括:步骤311、使用子类继承模式来创建动态类,即将基类(baseClass)指定为父类,将基础包(basePackage)和类名(beanName)组合并作为动态生成的类的名称;步骤312、读取Java对象中类(fields)的属性定义,即类(fields)的内容,依次迭代类(fields),如果当前迭代的类的属性定义存在注解(annotations)的属性定义,则先迭代注解(annotations)的属性定义并进行类属性注解创建;步骤313、使用定义的注解类型创建内置于字节码操作工具的注解定义模型,按照注解配置值(properties)中的定义设置注解属性(type)和注解值(value);步骤314、基于注解的属性定义,创建内置于字节码操作工具的类属性模型,将创建的所有类属性注解添加到类属性模型中,并输出类的动态。进一步地,所述步骤314中,使用注解类型指定的类型和注解名称指定的属性名称,创建内置于字节码操作工具的类属性模型。
[0035] 步骤32包括:步骤321、若Java对象中类的编译方式(compile)的赋值为假(false),则返回至类的动态,流程结束,即由字节码操作工具内置的类属性模型所输出的结果表示的动态类的定义;若Java对象中类的编译方式(compile)的赋值为真(true),则调用字节码操作工具的API,对类的动态进行编译;步骤322、基于步骤321,若Java对象中类的类加载方式(load)的赋值为假(false),则返回至类的动态的编译结果,流程结束;若Java对象中类的类加载方式(load)的赋值为真(true),则使用类加载器加载类的动态的编译结果,并输出字节码对象( java.lang.Class),流程结束。进一步地,所述字节码操作工具为ByteBuddy。
[0036] 最后应说明的是:以上各实施例仅仅为本发明的较优实施例用以说明本发明的技术方案,而非对其限制,当然更不是限制本发明的专利范围;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围;也就是说,但凡在本发明的主体设计思想和精神上作出的毫无实质意义的改动或润色,其所解决的技术问题仍然与本发明一致的,均应当包含在本发明的保护范围之内;另外,将本发明的技术方案直接或间接的运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。