两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

基于JAVA應(yīng)用的報(bào)表開發(fā)方法與流程

文檔序號:40614403發(fā)布日期:2025-01-07 21:02閱讀:8來源:國知局
基于JAVA應(yīng)用的報(bào)表開發(fā)方法與流程

本發(fā)明基于java應(yīng)用的報(bào)表開發(fā)方法,涉及java編譯領(lǐng)域。


背景技術(shù):

1、現(xiàn)有的關(guān)于java應(yīng)用的報(bào)表方法存在以下不足:

2、開發(fā)門檻較高:盡管java報(bào)表開發(fā)工具提供了豐富的功能和靈活性,但其開發(fā)門檻也相對較高;開發(fā)人員需要具備一定的java編程技能和報(bào)表設(shè)計(jì)經(jīng)驗(yàn),才能充分利用這些工具的優(yōu)勢。

3、性能問題:java是一種解釋型語言,其執(zhí)行效率相對于編譯型語言可能較低,若java語言在編譯的工程中出現(xiàn)數(shù)據(jù)處理邏輯錯誤或數(shù)據(jù)處理邏輯與用戶預(yù)設(shè)邏輯不通,會導(dǎo)致出現(xiàn)運(yùn)行錯誤或運(yùn)行速度緩慢。

4、學(xué)習(xí)曲線陡峭:對于初學(xué)者來說,掌握java的報(bào)表開發(fā)工具需要較長時(shí)間地學(xué)習(xí)和實(shí)踐,這是因?yàn)檫@些工具通常具有復(fù)雜的功能和靈活的配置選項(xiàng),對開發(fā)人員來說是一項(xiàng)巨大的學(xué)習(xí)成本。


技術(shù)實(shí)現(xiàn)思路

1、針對現(xiàn)有技術(shù)存在的不足,本發(fā)明目的是提供基于java應(yīng)用的報(bào)表開發(fā)方法,旨在解決java開發(fā)難度高的問題。

2、為了實(shí)現(xiàn)上述目的,本發(fā)明是通過如下的技術(shù)方案來實(shí)現(xiàn):基于java應(yīng)用的報(bào)表開發(fā)方法包括:

3、步驟s1:獲取java程序的源文件,并使用java編譯器提取源文件中的字符序列集;基于字符序列集進(jìn)行詞法分析,得到j(luò)ava程序的詞元和token;

4、步驟s2:將java程序的詞元和token作為語法分析器的輸入,基于java語法規(guī)則使用上下文無關(guān)文法匹配并組合java程序的詞元和token,構(gòu)建ast語法樹;

5、步驟s3:以jasperreports為報(bào)表工具,為java程序添加報(bào)表;提取java程序中的全部注解,判斷java程序中是否有全部注解對應(yīng)的注解處理器;若部分有或全部沒有,則將沒有注解處理器的注解作為未處理注解;在ast語法樹中提取未處理注解對應(yīng)的運(yùn)算符節(jié)點(diǎn)、表達(dá)式節(jié)點(diǎn)和賦值節(jié)點(diǎn)作為分析節(jié)點(diǎn),根據(jù)分析節(jié)點(diǎn)的語法結(jié)構(gòu),創(chuàng)建注解處理器,并修改ast語法樹;若全部有,則不處理;

6、步驟s4:將修改后的或未修改的ast語法樹作為用戶輸出;根據(jù)修改后的或未修改的ast語法樹,使用java編譯器,將java程序轉(zhuǎn)為字節(jié)碼文件。

7、進(jìn)一步地,所述步驟s1的具體步驟如下:

8、步驟s11:獲取oracle官網(wǎng)的java?se文檔;獲取java程序的源文件,基于java?se文檔使用java編譯器提取源文件中的標(biāo)識符、關(guān)鍵字、運(yùn)算符、變量以及常量等有序字符序列,作為字符序列集;

9、步驟s12:定義枚舉tokentype:用于表示字符序列集中不同有序字符序列對應(yīng)的token類型;

10、定義token類:用于存儲token的類型和值;使用構(gòu)造函數(shù)token(tokentype?type,string?value)初始化token的類型和值;

11、重寫tostring()方法,將tostring()方法的返回值修改為:

12、string.format("(%s,'%s')",type,value),用于以有限狀態(tài)自動機(jī)的形式輸出不同有序字符序列對應(yīng)的token信息;

13、步驟s13:定義lexer類;

14、在lexer類中,定義字符串變量input,用于存儲輸入字符串,即java程序的代碼;

15、定義整型變量position,用于儲存掃描位置,即java程序代碼的掃描位置;

16、定義整型變量length,用于儲存字符串長度,即java程序代碼的長度;

17、定義構(gòu)造函數(shù)lexer(string?input)用于初始化lexer對象,將掃描位置設(shè)置為0;輸入字符串設(shè)置為:hello?world,字符串長度設(shè)置為11;

18、步驟s14:定義lexer類的實(shí)現(xiàn)方法;

19、步驟s15:匯總tostring()方法的輸出,得到j(luò)ava程序的全部詞元和全部詞元對應(yīng)的token,進(jìn)入步驟s2。

20、進(jìn)一步地,所述步驟s14的具體步驟如下:

21、步驟s141:獲取java程序的首個(gè)有序字符序列,作為首字符;定義stringbuilder對象:用于接收首字符的字符串值;判斷首字符的字符類型,調(diào)用相應(yīng)的解析方法,解析首字符的語法元素;

22、步驟s142:若首字符的字符類型是java的標(biāo)識符(如變量名、函數(shù)名、類名等),則調(diào)用parseidentifier()方法;

23、步驟s143:若首字符的字符類型是整數(shù)型,則調(diào)用parseinteger()方法;若首字符的字符類型是浮點(diǎn)數(shù)型,則調(diào)用parsefloat()方法;若首字符的字符類型是大數(shù)型,則調(diào)用parsebignumber()方法;

24、步驟s144:若首字符的字符類型是運(yùn)算符,則調(diào)用parseoperator()方法;

25、步驟s145:若首字符的字符類型是括號,則調(diào)用parseparenthesis()法;

26、步驟s146:若首字符的字符類型是java關(guān)鍵字,則不解析;

27、步驟s147:調(diào)用getnexttoken()方法獲取下一個(gè)的非空有序字符序列的token,重復(fù)步驟s141~步驟s146,直至java程序中的每個(gè)有序字符序列都被解析。

28、進(jìn)一步地,所述步驟s2的具體步驟如下:

29、步驟s21:以巴科斯范式(bnf)或擴(kuò)展巴科斯范式(ebnf),作為java語法分析的語法規(guī)則;

30、步驟s22:定義一次詞法分析解析器的實(shí)現(xiàn)方法:parse方法,用于解析java程序中類對象的節(jié)點(diǎn);

31、步驟s23:定義二次詞法分析解析器的實(shí)現(xiàn)方法:parsemethod方法,用于解析java程序中非類對象或類中成員對象的節(jié)點(diǎn);

32、步驟s24:定義astnode類:用于記錄步驟s22~步驟s23輸出ast樹的全部節(jié)點(diǎn);

33、步驟s25:匯總astnode類的輸出,得到j(luò)ava程序的ast樹,進(jìn)入步驟s3。

34、進(jìn)一步地,所述步驟s22的具體步驟如下:

35、步驟s221:對應(yīng)私有方法parse,作為一次詞法分析解析器的入口;parse方法:無參數(shù),返回類型為:astnode;

36、步驟s222:創(chuàng)建一個(gè)astnode類型的對象root,表示ast樹的根節(jié)點(diǎn),root的初始值為空;

37、以存在main方法的類為起始類,將起始類的首個(gè)詞元記作首詞元;

38、從首詞元開始遍歷整個(gè)java程序的詞元,直至遇到文件結(jié)束標(biāo)記eof;

39、步驟s222:判斷首詞元對應(yīng)的token是否為class;

40、若是,則使用advance()方法獲取與首詞元對應(yīng)的下一個(gè)非java關(guān)鍵字詞元,記作主詞元;將主詞元作為ast樹的根節(jié)點(diǎn),即root的值為空主詞元;

41、若不是,則進(jìn)入步驟s23,解析首詞元對應(yīng)非類對象或類中成員對象的節(jié)點(diǎn),直至起始類中的全部詞元都被解析;

42、步驟s223:獲取起始類的引用類,作為跳躍類;

43、將跳躍類的首個(gè)詞元作為始詞元,解析始詞元的類型對象,進(jìn)入步驟s224;

44、若起始類沒有跳躍類,則獲取java程序的根目錄;以根目錄中首個(gè)非起始類的java類為跳躍類進(jìn)行解析;

45、步驟s224:檢查始詞元的token是否為class;

46、若是,則創(chuàng)建一個(gè)表示類名的astnode對象methodname接收始詞元,并接收始詞元添加到ast樹上類節(jié)點(diǎn)的子節(jié)點(diǎn)再調(diào)用advance()方法檢查parse方法輸出的下一個(gè)詞元的token;

47、若不是,則進(jìn)入步驟s23。

48、進(jìn)一步地,所述步驟s23的具體步驟如下:

49、步驟s231:定義私有方法parsemethod,作為二次詞法分析解析器的入口;parsemethod方法:無參數(shù),返回類型為:astnode;

50、步驟s232:獲取parsemethod方法輸出的詞元,作為當(dāng)前詞元;

51、檢查當(dāng)前詞元的token是否為java的關(guān)鍵字,且token是否為void;

52、若是,則創(chuàng)建一個(gè)表示返回值類型的astnode對象returntype接收當(dāng)前詞元,并將當(dāng)前詞元添加到ast樹上方法節(jié)點(diǎn)的子節(jié)點(diǎn),再調(diào)用advance()方法檢查parsemethod方法輸出的下一個(gè)詞元的token;

53、若不是,則進(jìn)入步驟s234;

54、步驟s233:檢查當(dāng)前詞元的token是否為標(biāo)識符(即方法名或變量名);

55、若是,則創(chuàng)建一個(gè)表示方法名的astnode對象methodname接收當(dāng)前詞元,并接收當(dāng)前詞元添加到ast樹上表達(dá)式節(jié)點(diǎn)的子節(jié)點(diǎn),再調(diào)用advance()方法檢查parsemethod方法輸出的下一個(gè)詞元的token;

56、若不是,則進(jìn)入步驟s234;

57、步驟s234:檢查當(dāng)前詞元的token是否為分常量,若是,則創(chuàng)建一個(gè)表示常量的astnode對象methodname接收當(dāng)前詞元,并接收當(dāng)前詞元添加到ast樹上常量節(jié)點(diǎn)的子節(jié)點(diǎn),再調(diào)用advance()方法檢查parsemethod方法輸出的下一個(gè)詞元的token;

58、若不是,則進(jìn)入步驟s235;

59、步驟s235:檢查當(dāng)前詞元的token是否為運(yùn)算符,若是,則創(chuàng)建一個(gè)表示運(yùn)算符的astnode對象methodname接收當(dāng)前詞元,并接收當(dāng)前詞元添加到ast樹上運(yùn)算符節(jié)點(diǎn)的子節(jié)點(diǎn),再調(diào)用advance()方法檢查parsemethod方法輸出的下一個(gè)詞元的token;

60、若不是,則進(jìn)入步驟s236;

61、步驟s236:檢查當(dāng)前詞元的token是否為分隔符,并且token是否為英語左括號或英語左花括號;

62、若是,則創(chuàng)建一個(gè)表示分隔符的astnode對象methodname接收當(dāng)前詞元,并接收當(dāng)前詞元添加到ast樹上分隔符節(jié)點(diǎn)的子節(jié)點(diǎn),再創(chuàng)建循環(huán)結(jié)構(gòu),依次遍歷parsemethod方法輸出的詞元,直至找到英語右括號或英語右花括號;將循環(huán)結(jié)構(gòu)輸出的詞元作為步驟s232~步驟s236的輸入,提取其中的java關(guān)鍵字、標(biāo)識符和分隔符;

63、若不是,則拋出一個(gè)運(yùn)行時(shí)異常,表示當(dāng)前詞元不是方法,返回步驟s22。

64、進(jìn)一步地,所述步驟s24的具體步驟如下:

65、步驟s241:定義astnode類的成員變量:

66、定義string類型(成員)變量type:用于存儲抽象語法樹的節(jié)點(diǎn)類型;

67、定義泛型列表(成員)變量children:用于存儲ast樹上節(jié)點(diǎn)的子節(jié)點(diǎn)序列;

68、步驟s242:初始化astnode類的構(gòu)造函數(shù),并創(chuàng)建一個(gè)空的子節(jié)點(diǎn)列表;

69、步驟s243:使用addchild方法,向變量children中添加子節(jié)點(diǎn);

70、重寫tostring方法:用于以字符串的形式返回ast樹上的類節(jié)點(diǎn)、方法節(jié)點(diǎn)、表達(dá)式節(jié)點(diǎn)、常量節(jié)點(diǎn)、運(yùn)算符節(jié)點(diǎn)和分隔符節(jié)點(diǎn)以及類節(jié)點(diǎn)、方法節(jié)點(diǎn)、表達(dá)式節(jié)點(diǎn)、常量節(jié)點(diǎn)、運(yùn)算符節(jié)點(diǎn)和分隔符節(jié)點(diǎn)對應(yīng)的子節(jié)點(diǎn)。

71、進(jìn)一步地,所述步驟s3的具體步驟如下:

72、步驟s31:以jasperreports為報(bào)表工具,為java程序添加報(bào)表;

73、步驟s311:定義公共類jasperreportexample;

74、使用try-catch塊來捕獲jasperreportexample類發(fā)生的異常;

75、步驟s312:使用compilereport方法編譯java程序的報(bào)表模板文件,并生成一個(gè)jasperreport對象;

76、定義string類型的變量reportsource:用于存儲報(bào)表模板文件的路徑;

77、步驟s313:定義泛型列表變量datalist;調(diào)用getdata方法獲取java程序中的報(bào)表數(shù)據(jù),并用變量datalist接收;

78、使用jrbeancollectiondatasource方法,創(chuàng)建一個(gè)數(shù)據(jù)源對象,并將變量datalist傳遞至jasperreportexample類的構(gòu)造函數(shù);

79、步驟s314:創(chuàng)建hashmap類型的對象parameters,用于存儲變量datalist接收的鍵值對;

80、使用jasperfillmanager的fillreport方法填充報(bào)表,將jasperreport對象和變量datalist傳遞至fillreport方法,并返回jasperprint對象;

81、步驟s315:將jasperprint對象封裝在simpleexporterinput對象中,并傳遞至setexporterinput方法;

82、使用simpleoutputstreamexporteroutput對象,對變量reportsource進(jìn)行封裝;調(diào)用exportreport方法導(dǎo)出java程序的報(bào)表;

83、步驟s32:提取java程序中的全部注解,判斷java程序中是否有全部注解對應(yīng)的注解處理器;

84、若部分有或全部沒有,則將沒有注解處理器的注解作為未處理注解;在ast語法樹中提取未處理注解對應(yīng)的節(jié)點(diǎn),修改ast語法樹,進(jìn)入步驟s33;

85、若全部有,則不處理;

86、步驟s33:在ast語法樹中提取未處理注解對應(yīng)的運(yùn)算符節(jié)點(diǎn)、表達(dá)式節(jié)點(diǎn)和賦值節(jié)點(diǎn)作為分析節(jié)點(diǎn),根據(jù)分析節(jié)點(diǎn)的語法結(jié)構(gòu),創(chuàng)建注解處理器,并修改ast語法樹;

87、步驟s34:匯總步驟s31~步驟s33添加并修改后的java程序,作為java程序詞法分析的輸入,重新執(zhí)行步驟s2,直至java程序中全部注解都有其對應(yīng)的注解處理器。

88、進(jìn)一步地,所述步驟s33的具體步驟如下:

89、步驟s331:提取未處理注解對應(yīng)的運(yùn)算符節(jié)點(diǎn),作為目標(biāo)節(jié)點(diǎn);

90、根據(jù)目標(biāo)節(jié)點(diǎn)調(diào)整ast語法樹;

91、步驟s332:提取目標(biāo)節(jié)點(diǎn)對應(yīng)的類節(jié)點(diǎn),記作目標(biāo)節(jié)點(diǎn)a1;

92、根據(jù)目標(biāo)節(jié)點(diǎn)a1在java程序中找到目標(biāo)節(jié)點(diǎn)a1對應(yīng)的方法,記作目標(biāo)方法;

93、根據(jù)目標(biāo)節(jié)點(diǎn)a1在java程序中找到目標(biāo)節(jié)點(diǎn)a1對應(yīng)的類,記作目標(biāo)類;

94、檢測目標(biāo)類中是否有繼承關(guān)鍵字extends;

95、若有,則根據(jù)目標(biāo)類的父類,創(chuàng)建注解處理器,進(jìn)入步驟s333;

96、若沒有,則檢測目標(biāo)類中是否有實(shí)現(xiàn)關(guān)鍵字implements,進(jìn)入步驟s334;

97、步驟s333:根據(jù)目標(biāo)類繼承的父類,創(chuàng)建注解處理器;

98、步驟s3331:在java程序meta-inf/services目錄下創(chuàng)建一個(gè)名為:avax.目標(biāo)類名.目標(biāo)方法名.目標(biāo)節(jié)點(diǎn)名的文件;

99、步驟s3332:在目標(biāo)類繼承的父類中,找到與目標(biāo)方法或目標(biāo)節(jié)點(diǎn)同名的方法或符號;

100、步驟s3333:將父類中與目標(biāo)方法同名的方法,記作參照方法;將父類中與目標(biāo)節(jié)點(diǎn)同名的符號,記作參照符號;

101、步驟s3334:根據(jù)參照方法重載目標(biāo)類中的目標(biāo)方法;

102、獲取父類中參照符號的定義方法,作為導(dǎo)出方法;將導(dǎo)出方法導(dǎo)入目標(biāo)類中目標(biāo)方法的函數(shù)體中;

103、步驟s334:若目標(biāo)類中有實(shí)現(xiàn)關(guān)鍵字的implements,則在目標(biāo)類實(shí)現(xiàn)的接口中,找到與目標(biāo)方法或目標(biāo)節(jié)點(diǎn)同名的方法或符號,重復(fù)步驟s333中的相同步驟創(chuàng)建注解處理器;

104、若目標(biāo)類中沒有實(shí)現(xiàn)關(guān)鍵字的implements,則進(jìn)入步驟s335。

105、進(jìn)一步地,所述步驟s334的后續(xù)步驟如下:

106、步驟s335:統(tǒng)計(jì)java程序中全部類的數(shù)量和每個(gè)類對應(yīng)的全部方法數(shù)量;

107、將java程序中全部類的數(shù)量,記作cl;將每個(gè)類對應(yīng)的全部方法數(shù)量記作me1、me2~mecl;

108、其中,me1表示java程序中第1個(gè)類對應(yīng)的全部方法數(shù)量;me2表示java程序中第2個(gè)類對應(yīng)的全部方法數(shù)量;以此類推,mecl表示java程序中第cl個(gè)類對應(yīng)的全部方法數(shù)量;

109、步驟s336:設(shè)java程序中第i個(gè)類對應(yīng)的全部詞元數(shù)為:lea(i);

110、設(shè)java程序中第i個(gè)類對應(yīng)的第j個(gè)方法中詞元數(shù)為:leb(i,j);

111、設(shè)java程序中第i個(gè)類對應(yīng)的第j個(gè)方法中,與目標(biāo)符號相同符號數(shù):lec(i,j);

112、定義java程序中第i個(gè)類對應(yīng)的第j個(gè)方法與目標(biāo)符號相同的tf-idf值,記作tf-idf(i,j)值;

113、其中,i和j都是正整數(shù),i的取值范圍為:1~cl,j的取值范圍為:me1~mecl;

114、tf-idf(i,j)的計(jì)算式如下:

115、計(jì)算java程序中第i個(gè)類對應(yīng)的第j個(gè)方法與目標(biāo)符號相同的逆文檔頻率idf(i,j),idf(i,j)的計(jì)算式如下:

116、

117、計(jì)算java程序中第i個(gè)類對應(yīng)的第j個(gè)方法與目標(biāo)符號相同的逆文檔頻率tf-idf(i,j),tf-idf(i,j)的計(jì)算式如下:

118、

119、步驟s337:根據(jù)步驟s336定義的tf-idf(i,j)計(jì)算式,計(jì)算java程序中每個(gè)類對應(yīng)的每個(gè)方法的tf-idf值,得到tf-idf(1,1)、tf-idf(1,2)~tf-idf(1,me1)~tf-idf(cl,mecl);

120、其中,tf-idf(1,1)表示java程序中第1個(gè)類對應(yīng)的第1個(gè)方法的tf-idf值;tf-idf(1,2)表示java程序中第1個(gè)類對應(yīng)的第2個(gè)方法的tf-idf值;依次類推,tf-idf(1,me1)表示java程序中第1個(gè)類對應(yīng)的第me1個(gè)方法的tf-idf值;tf-idf(cl,mecl)表示java程序中第cl個(gè)類對應(yīng)的第mecl個(gè)方法的tf-idf值;

121、按tf-idf(1,1)~tf-idf(cl,mecl)降序的順序排列java程序中的方法,得到優(yōu)先方法序列;

122、將優(yōu)先方法序列中首個(gè)tf-idf值對應(yīng)的方法作為參考方法,根據(jù)參考方法,重復(fù)步驟s333中的相同步驟,創(chuàng)建注解處理器;

123、步驟s338:重復(fù)為未處理注解對應(yīng)的運(yùn)算符節(jié)點(diǎn)創(chuàng)建注解處理器的相同步驟,為未處理注解對應(yīng)的表達(dá)式節(jié)點(diǎn)和賦值節(jié)點(diǎn)創(chuàng)建注解處理器。

124、與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:

125、無縫集成與平臺兼容性:由于java的跨平臺特性,本發(fā)明能夠集成到各種j2ee應(yīng)用系統(tǒng)中,這種兼容性使得報(bào)表模塊在不同操作系統(tǒng)和硬件平臺上運(yùn)行,無需對報(bào)表代碼進(jìn)行大量修改。

126、代碼處理能力強(qiáng):本發(fā)明能夠高效地處理大量數(shù)據(jù),生成復(fù)雜的報(bào)表和圖表,為用戶對java工程的修改提供支持。

127、擴(kuò)展java的功能:本發(fā)明可以在java應(yīng)用中支持運(yùn)算符重載,基于ast樹自動分析數(shù)據(jù)之間的依賴關(guān)系,重編排執(zhí)行順序,既減少了開發(fā)人員的負(fù)擔(dān)。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
砚山县| 彩票| 定陶县| 章丘市| 巴彦县| 贡觉县| 榕江县| 米林县| 黄浦区| 都昌县| 科技| 久治县| 比如县| 化德县| 车险| 延边| 且末县| 新巴尔虎左旗| 马尔康县| 盐边县| 班玛县| 阿拉善右旗| 广丰县| 罗江县| 吴江市| 革吉县| 西和县| 秭归县| 晋江市| 丹寨县| 天祝| 隆安县| 大安市| 广西| 兴隆县| 抚松县| 额尔古纳市| 故城县| 寻乌县| 丰顺县| 巴彦淖尔市|