基于字节码增强技术实现JAVA模式匹配特性的方法与流程

文档序号:20837514发布日期:2020-05-22 17:03阅读:132来源:国知局
基于字节码增强技术实现JAVA模式匹配特性的方法与流程

本发明涉及电数字数据处理的技术领域,特别涉及一种基于字节码增强技术实现java模式匹配特性的方法。



背景技术:

java是一种面向对象的编程语言,由于其严格的面向对象风格,很适合实际业务逻辑的抽象,在web应用中使用非常广泛,然而,随着业务逻辑的复杂度增加,对象关系日渐复杂,不得不需要处理数据内部复杂的树状结构,从而导致大量的逻辑判断与代码分支,逻辑不直观,代码维护困难;模式匹配作为一种构造表达式,可以用来构造复杂树状对象,在数据实际位置填上占位变量,可以更直观的表达数据结构,代码更清晰易读。

模式匹配作为一种语言特性,在上世纪七十年代中期就已经出现。并在许多函数式语言中作为标准功能,比如ml、caml、erlang、haskell,以及同样运行在java虚拟机之上的scala;java从1.8版本开始支持函数编程,同样支持函数式的scala语言也遵循java虚拟机字节码规范。

当然,提到模式,更容易想到的是正则表达式中的模式,然而,正则表达式仅能处理字符串这样的字符数组结构,是模式匹配中的一种特殊情况。以java中的switch-case为例,其只能识别基本数据类型及string字符串,表达形式非常有限。

同时,实际上面向对象编程中有一种设计模式叫做访问者模式,利用模式匹配能处理的事务也可以用访问者模式来表达,但访问者模式利用了面向对象的虚方法分发机制,这导致在实践中访问者模式非常笨重,很多用模式匹配很容易做到的事情,用访问者模式做不到,最终导致访问者实现代码非常厚重。



技术实现要素:

本发明解决了现有技术中存在的问题,提供了一种优化的基于字节码增强技术实现java模式匹配特性的方法,以模式形式进行匹配,可以匹配对象的内在构建形式,表达形式更加多样化,代码也非常简洁易读,可以处理面向对象的复杂树形数据结构。

本发明所采用的技术方案是,一种基于字节码增强技术实现java模式匹配特性的方法,所述方法包括以下步骤:

步骤1:基于java的语法规则定义java可识别的模式匹配语法结构;

步骤2:自定义注解与注解处理器,完成编译期的代码增强;

步骤3:对java内置功能进行扩展;

步骤4:实现java模式匹配。

优选地,所述步骤1中,任一模式匹配语法结构包括匹配器及若干与其对应的逻辑分支。

优选地,所述步骤2包括以下步骤:

步骤2.1:自定义注解;所述注解添加在类构造器上;

步骤2.2:编写注解处理器,用于在编译期自动执行处理器代理、识别被注解的类并增强。

优选地,所述步骤2.1中,被添加的类可以完成属性增加、构造器补全、类型匹配和构造器匹配。

优选地,所述步骤2.2包括以下步骤:

步骤2.2.1:加载被注解类的源代码,解析构造器;

步骤2.2.2:若构造器存在参数,则进行下一步,否则,进行步骤2.2.6;

步骤2.2.3:若构造器参数在类属性中,则直接进行下一步,否则,增加类属性后进行下一步;

步骤2.2.4:补全类结构器;

步骤2.2.5:直接添加构造器匹配器;

步骤2.2.6:添加类型匹配器,生成字节码。

优选地,所述步骤2.2.5中,若构造方法参数不为空,则同步生成一个构造器匹配器,根据构造器结构编写模式表达式,完成实例内部数据的匹配判断。

优选地,所述步骤3中,扩展包括:

正则表达式的字符串类型模式匹配扩展到符合任意数据类型的数据结构深度匹配;

switch-case关键字仅能实现的基本数据类型判断扩展到任意数据结构的逻辑判断。

优选地,所述步骤4中,实现的java模式匹配包括通配符匹配、序列集合匹配、正则表达式匹配、类构造器匹配和数据深度匹配。

本发明提供了一种优化的基于字节码增强技术实现java模式匹配特性的方法,通过基于java的语法规则定义java可识别的模式匹配语法结构,自定义注解与注解处理器,完成编译期的代码增强,对java内置功能进行扩展,最终实现java模式匹配。

本发明基于java语法定义模式匹配语法,使其可以使用类型、通配符、序列、正则表达式、对象状态解构java复合数据,通过作为插入式注解处理api的jsr-269规范在java源代码编译阶段识别自定义注解,并生成对应java标准字节码,使其运行于jvm之上;通过模式方式定义业务数据,基于业务模式导向代码执行,减少了模板式代码的出现,简化业务代码,逻辑更清晰易读。

本发明使得java能够更好地处理复杂的数据结构,使用更少的代码处理复杂的业务逻辑,将开发人员从层层嵌套的if_else逻辑语句中解救出来,提高开发效率,减少逻辑错误率。

本发明的有益效果在于:

(1)增强java模式匹配功能,将仅处理字符串的正则表达式扩展成处理任意数据结构的更一般方案;

(2)对java中switch-case关键字进行增强,使其可对任意数据类型做类型判断或数据结构匹配;

(3)作为一种更好的业务数据抽象能力,将复杂的业务逻辑通过模式表达式直观表达出来,更好地处理复杂的树状数据结构,代码逻辑更简洁易读,提高开发效率,减少逻辑错误率。

附图说明

图1为本发明的流程图。

具体实施方式

下面结合实施例对本发明做进一步的详细描述,但本发明的保护范围并不限于此。

本发明涉及一种基于字节码增强技术实现java模式匹配特性的方法,其中,字节码增强技术的框架众多,主要根据运行时期不同分为编译期增强、类加载期增强、运行期增强,本发明主要描述了使用jsr-269标准在编译期对字节码做增强处理的方式,但如使用asm、javassist、cglib等技术操作字节码均可实现本技术方案,均属于本专利技术方案之内。

本发明中,java字节码是java虚拟机执行的一种虚拟指令格式,它是程序的一种低级表示,可以运行于java虚拟机上;将程序抽象成字节码可以保证java程序在各种设备上的运行,可以直接修改class文件中的字节码起到修改代码逻辑的作用;jsr-269作为一种jdk实现的代码增强工具,提供了一组插入式注解处理器的标准api在编译期间对注解进行处理的方式。

本发明中,可以将jsr-269看做是一组编译器的插件,在这些插件里面,可以读取、修改、添加抽象语法树中的任意元素,如果这些插件在处理注解期间对语法树进行了修改,编译器将回到解析及填充符号表的过程重新处理,直到所有插入式注解处理器都没有再对语法树进行修改为止,每一次循环称为一个循环;有了编译器注解处理的标准api后,代码才有可能干涉编译器的行为,由于语法树中的任意元素,甚至包括代码注释都可以在插件之中访问到,所以通过插入式注解处理器实现的插件在功能上有很大的发挥空间。

本发明中,使用jsr-269规范对源代码进行增强处理,减少了模板式代码的编写,开发仅需关注模式表达式编写就能完成业务逻辑开发。

本发明的方法包括以下步骤。

步骤1:基于java的语法规则定义java可识别的模式匹配语法结构。

所述步骤1中,任一模式匹配语法结构包括匹配器及若干与其对应的逻辑分支。

本发明中,举例来说,

matcher(

case(pattern,r->dosomething),

case(pattern,r->dosomething),

).match(data);

其中,matcher表示匹配器,为一个独立的逻辑匹配单元,包含一个以上逻辑分支case;case表示逻辑分支,包含一个模式表达式和一个lambda表达式,逻辑分支按顺序匹配,如果匹配成功则执行lambda代码,与java的switch-case不同,任意一个case匹配成功后即跳出匹配,不会继续匹配;pattern为模式表达式,可构建树形的表达式结构,完成类型、通配符、序列、正则表达式及深度数据匹配,匹配成功则执行紧随的lambda表达式;lambda表达式,如果数据匹配成功,则传入lambda完成具体的业务逻辑操作;data为需要匹配的具体数据。

步骤2:自定义注解与注解处理器,完成编译期的代码增强。

所述步骤2包括以下步骤:

步骤2.1:自定义注解;所述注解添加在类构造器上;

所述步骤2.1中,被添加的类可以完成属性增加、构造器补全、类型匹配和构造器匹配。

步骤2.2:编写注解处理器,用于在编译期自动执行处理器代理、识别被注解的类并增强。

所述步骤2.2包括以下步骤:

步骤2.2.1:加载被注解类的源代码,解析构造器;

步骤2.2.2:若构造器存在参数,则进行下一步,否则,进行步骤2.2.6;

步骤2.2.3:若构造器参数在类属性中,则直接进行下一步,否则,增加类属性后进行下一步;

步骤2.2.4:补全类结构器;

步骤2.2.5:直接添加构造器匹配器;

所述步骤2.2.5中,若构造方法参数不为空,则同步生成一个构造器匹配器,根据构造器结构编写模式表达式,完成实例内部数据的匹配判断。

步骤2.2.6:添加类型匹配器,生成字节码。

本发明中,通过jsr-269标准,自定义注解与注解处理器,完成编译期的代码增强。

本发明中,关于源代码字节码的增强,包括使用jsr-269规范对源代码增强,减少重复模板代码编写,及轻耦合,即仅需要添加注解就能获得模式匹配的能力,不需关注实现细节,只关注模式表达式编写即可。

本发明中,自定义注解@case,注解只能添加在类构造器上,被添加的类可完成属性增加、构造器补全、类型匹配,构造器匹配;编写注解处理器,jsr-269在编译期自动执行处理器代码,识别被@case注解的类,增强被注解类使其具备模式匹配能力。

本发明中,对于属性增加与构造器补全,加载被注解类源代码,判断被注解构造方法是否存在参数,根据方法参数创建同类型类属性以及getset方法,补全构造方法体,使其作为完整构造器,可正常创建实例,如:

personperson=newperson("张三",18);

person.setage(20);

system.out.println(person.getage());//20

即被注解类可以作为完整类定义使用。

本发明中,对于支持类型匹配,被注解类会同步生成一个类型匹配器,与模式语法配合可完成对象类型判断,如:

personperson=newperson("张三",18);

matcher(

case(person,p->p.setage(20))

).match(person);

system.out.println(person.getage());//20

即,被注解类会可作为类型匹配器使用。

本发明中,对于支持构造器匹配,如果构造方法参数不为空,则会同步生成一个构造器匹配器,可根据构造器结构编写模式表达式,完成实例内部数据的匹配判断,如:

personperson1=newperson("张三",18);

personperson2=newperson("李四",18);

matchermatcher=matcher(

case(person("张三",18),p->p.setage(20))

);

matcher.match(person1);

matcher.match(person2);

system.out.println(person1.getage());//20

system.out.println(person2.getage());//18

即可根据构造方法编写表达式做实例数据匹配。

以上“//”后为输出值。

步骤3:对java内置功能进行扩展。

所述步骤3中,扩展包括:

正则表达式的字符串类型模式匹配扩展到符合任意数据类型的数据结构深度匹配;

switch-case关键字仅能实现的基本数据类型判断扩展到任意数据结构的逻辑判断。

本发明中,java内置的switch-case,仅能判断基本类型与字符串,如:

switch(type){

case1:

break;

case2:

break;

default:

};

扩展后的模式匹配可完成任意数据结构的判断,更灵活应对不同场景下的需求,如:

matcher(

case(person("李四",_,_),p->p),//匹配姓名李四

case(person("张三",20,_),p->p),//匹配姓名张三,年龄20岁

case(person(r("^张.*"),_,_),p->p),//正则表达式,匹配张姓

case(person(_,_,dept("人力")),p->p),//匹配人力部门的人员

).match(person)。

步骤4:实现java模式匹配。

所述步骤4中,实现的java模式匹配包括通配符匹配、序列集合匹配、正则表达式匹配、类构造器匹配和数据深度匹配。

本发明中,通过jsr-269已赋予对象基本的模式匹配能力,同时本发明也可以内置一些通用匹配器,当与对象匹配器相配合时可完成更复杂的数据结构匹配。

本发明中,对于序列集合匹配,内置序列匹配器,可对java内置数据集合进行匹配,模式表达式可如下:

list(1,2,3)用于匹配list数据集合,集合元素为1、2、3;

array(1,2,3)用于匹配数组对象,集合元素为1、2、3。

本发明中,对于通配符匹配,支持两种通配符匹配,可对结构数据做部分判断,灵活配置适用不同业务逻辑:

(1)单个匹配,以"_"用于匹配任意单个元素,可在构造器、序列表达式中使用,模式表达式如下:

person("张三",_),即姓名为张三的任意person实例;

list(1,_,_),即长度为3且第一个元素为1的任意list;

(2)多个匹配,以"_n"用于匹配任意多个元素,可在序列表达式中使用,如:

list(1,_n),即第一个元素为1的任意list。

本发明中,对于正则表达式匹配,支持正则表达式,可对字符串数据做更丰富的匹配判断,模式表达式如下:

person(r("^张.*"),_),即姓名为张开头的任意person实例。

本发明中,对于深度匹配,随着业务逻辑的逐渐复杂,复合的数据类型关系也变得复杂,深度的树状数据结构变得更加难以处理,通过类的模式匹配增强,可以很容易地通过模式表达式来表达数据结构中的业务逻辑,如通过模式来表达员工与部门的逻辑关系:

表达式匹配:张姓,20岁,研发部门,为case(person(r("^张.*"),20,dept("研发")),p->p);

表达式匹配:20-25岁,人力资源,为case(person(_,btw(20,25),dept("人力")),p->p)。

本发明通过基于java的语法规则定义java可识别的模式匹配语法结构,自定义注解与注解处理器,完成编译期的代码增强,对java内置功能进行扩展,最终实现java模式匹配。

本发明基于java语法定义模式匹配语法,使其可以使用类型、通配符、序列、正则表达式、对象状态解构java复合数据,通过作为插入式注解处理api的jsr-269规范在java源代码编译阶段识别自定义注解,并生成对应java标准字节码,使其运行于jvm之上;通过模式方式定义业务数据,基于业务模式导向代码执行,减少了模板式代码的出现,简化业务代码,逻辑更清晰易读。

本发明使得java能够更好地处理复杂的数据结构,使用更少的代码处理复杂的业务逻辑,将开发人员从层层嵌套的if_else逻辑语句中解救出来,提高开发效率,减少逻辑错误率。

本发明的有益效果在于增强java模式匹配功能,将仅处理字符串的正则表达式扩展成处理任意数据结构的更一般方案,对java中switch-case关键字进行增强,使其可对任意数据类型做类型判断或数据结构匹配,作为一种更好的业务数据抽象能力,将复杂的业务逻辑通过模式表达式直观表达出来,更好地处理复杂的树状数据结构,代码逻辑更简洁易读,提高开发效率,减少逻辑错误率。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1