專利名稱:Java卡的數(shù)據(jù)處理方法及裝置的制作方法
技術(shù)領(lǐng)域:
本申請(qǐng)涉及智能卡技術(shù)領(lǐng)域,特別是涉及一種JAVA卡的數(shù)據(jù)處理方法及裝置。
背景技術(shù):
JAVA卡是一種可以運(yùn)行JAVA程序的CPU智能卡。通過(guò)JAVA卡,開(kāi)發(fā)人員可以任意選擇他們所熟悉和喜歡的開(kāi)發(fā)工具。由于對(duì)JAVA卡的編程是用JAVA語(yǔ)言,所以幾乎當(dāng)今所有流行的JAVA開(kāi)發(fā)環(huán)境,如VJ++,Vcafe等,都可以被用來(lái)進(jìn)行JAVA卡的開(kāi)發(fā),從而使得快速完成和調(diào)試JAVA卡的應(yīng)用程序變?yōu)榱丝赡?。此外,也使得任何JAVA開(kāi)發(fā)人員都可以變?yōu)镴AVA卡開(kāi)發(fā)人員,為智能卡的發(fā)展提供強(qiáng)有力的人才保證和更好的應(yīng)用前景。目前,在JAVA智能卡的開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)人員需要在JAVA層定義大量的靜態(tài)全局變量(即靜態(tài)成員變量),這些靜態(tài)全局變量在運(yùn)行過(guò)程中放在EEPROM (Electrically Erasable Programmable Read-Only Memory,電可擦可編程只讀存儲(chǔ)器)中。因?yàn)镴AVA應(yīng)用中的靜態(tài)全局變量是存放在EEPROM中,所以對(duì)靜態(tài)全局變量的訪問(wèn)要通過(guò)靜態(tài)全局變量的相對(duì)于靜態(tài)組件的偏移地址來(lái)計(jì)算出靜態(tài)全局變量的實(shí)際地址,進(jìn)而進(jìn)行相應(yīng)的訪問(wèn)和處理,如圖I所示。這樣,在開(kāi)發(fā)過(guò)程中,需要操作這些變量時(shí)就會(huì)有大量的讀寫EEPROM 的過(guò)程,然而讀寫EEPROM非常耗時(shí),從而影響JAVA卡開(kāi)發(fā)和JAVA程序的執(zhí)行效率??傊?,需要本領(lǐng)域技術(shù)人員迫切解決的一個(gè)技術(shù)問(wèn)題就是如何提高JAVA卡開(kāi)發(fā)和JAVA程序執(zhí)行的效率。
發(fā)明內(nèi)容
本申請(qǐng)所要解決的技術(shù)問(wèn)題是提供一種JAVA卡的數(shù)據(jù)處理方法及裝置,以解決如何提高JAVA卡開(kāi)發(fā)和JAVA程序執(zhí)行的效率的問(wèn)題。為了解決上述問(wèn)題,本申請(qǐng)公開(kāi)了一種JAVA卡的數(shù)據(jù)處理方法,用于在內(nèi)存中訪問(wèn)靜態(tài)全局變量,包括為靜態(tài)全局變量設(shè)置內(nèi)存屬性,用于指示在JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行與所述內(nèi)存屬性相對(duì)應(yīng)的處理;根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址;根據(jù)所述內(nèi)存地址在所述JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行訪問(wèn)。優(yōu)選地,所述根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟包括根據(jù)所述內(nèi)存屬性從所述JAVA卡的電可擦可編程只讀存儲(chǔ)器 EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址;根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。優(yōu)選地,在所述根據(jù)所述內(nèi)存屬性從所述JAVA卡的EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址的步驟之前,還包括使用至少一個(gè)數(shù)組表示多個(gè)所述靜態(tài)全局變量,每個(gè)所述數(shù)組具有一個(gè)數(shù)組標(biāo)識(shí);將每個(gè)所述數(shù)組以對(duì)象的形式存儲(chǔ)到所述EEPROM中,每個(gè)數(shù)組對(duì)象中存儲(chǔ)有該數(shù)組中每個(gè)所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址。
優(yōu)選地,在所述將每個(gè)所述數(shù)組以對(duì)象的形式存儲(chǔ)到所述EEPROM中的步驟之后, 還包括使用所述數(shù)組標(biāo)識(shí)生成對(duì)象表,所述對(duì)象表中的每一個(gè)所述數(shù)組標(biāo)識(shí)指向該數(shù)組標(biāo)識(shí)所標(biāo)識(shí)的數(shù)組在所述EEPROM中存儲(chǔ)的數(shù)組對(duì)象的地址。優(yōu)選地,所述根據(jù)所述內(nèi)存屬性從EEPROM中獲取所述靜態(tài)全局變量在所述JAVA 卡的內(nèi)存中的偏移地址的步驟包括獲取所述靜態(tài)全局變量所在數(shù)組的數(shù)組標(biāo)識(shí);根據(jù)該數(shù)組標(biāo)識(shí)從所述對(duì)象表中獲取該數(shù)組在所述EEPROM中存儲(chǔ)的數(shù)組對(duì)象的地址;根據(jù)該數(shù)組對(duì)象的地址,獲取該地址的數(shù)組對(duì)象中的所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址。優(yōu)選地,在所述為靜態(tài)全局變量設(shè)置內(nèi)存屬性的步驟之后,還包括生成包括所述靜態(tài)全局變量的JAVA類文件;對(duì)所述JAVA類文件進(jìn)行解析,輸出所述靜態(tài)全局變量的內(nèi)存屬性。優(yōu)選地,所述根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟包括根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址;根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。優(yōu)選地,在所述根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址的步驟之后,還包括使用設(shè)置的私有字節(jié)碼指令替換對(duì)所述靜態(tài)全局變量進(jìn)行處理的原字節(jié)碼指令,所述私有字節(jié)碼指令用于在所述JAVA卡的內(nèi)存中操作所述
靜態(tài)全局變量。優(yōu)選地,若存在多個(gè)所述靜態(tài)全局變量,則在所述根據(jù)偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟之前或之后,還包括獲取所述多個(gè)靜態(tài)全局變量的總偏移值,作為下一次指定具有所述內(nèi)存屬性的靜態(tài)全局變量偏移地址的基址。為了解決上述問(wèn)題,本申請(qǐng)還公開(kāi)了一種JAVA卡的數(shù)據(jù)處理裝置,用于在內(nèi)存中訪問(wèn)靜態(tài)全局變量,所述裝置包括設(shè)置模塊,用于為靜態(tài)全局變量設(shè)置內(nèi)存屬性,以指示在JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行與所述內(nèi)存屬性相對(duì)應(yīng)的處理;獲取模塊,用于根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址;處理模塊,用于根據(jù)所述內(nèi)存地址在所述JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行訪問(wèn)。優(yōu)選地,所述獲取模塊包括第一地址獲取模塊,用于根據(jù)所述內(nèi)存屬性從所述 JAVA卡的電可擦可編程只讀存儲(chǔ)器EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址;第二地址獲取模塊,用于根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述 JAVA卡的內(nèi)存中的內(nèi)存地址。優(yōu)選地,所述獲取模塊包括地址指定模塊,用于根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址;第三地址獲取模塊,用于根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。與現(xiàn)有技術(shù)相比,本申請(qǐng)具有以下優(yōu)點(diǎn)本申請(qǐng)通過(guò)為JAVA卡中設(shè)置的靜態(tài)全局變量設(shè)置內(nèi)存屬性,明確了對(duì)靜態(tài)全局變量的處理(包括寫入、修改、刪除等等),在JAVA卡的內(nèi)存中進(jìn)行。進(jìn)而根據(jù)該內(nèi)存屬性, 獲取具有該屬性的靜態(tài)全局變量在JAVA卡內(nèi)存中的地址,從而實(shí)現(xiàn)了在JAVA卡的內(nèi)存中對(duì)靜態(tài)全局變量的處理,避免了多次、反復(fù)訪問(wèn)EEPR0M造成的耗時(shí)和低效率,提高了 JAVA 卡開(kāi)發(fā)和JAVA程序執(zhí)行的效率。
圖1是根據(jù)現(xiàn)有技術(shù)的一種JAVA卡的靜態(tài)全局變量的處理方法的示意圖;圖2是根據(jù)本申請(qǐng)實(shí)施例一的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程圖;圖3是根據(jù)本申請(qǐng)實(shí)施例二的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程圖;圖4是圖3所示實(shí)施例的JAVA卡數(shù)據(jù)處理的示意圖;圖5是根據(jù)本申請(qǐng)實(shí)施例三的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程圖;圖6是圖5所示實(shí)施例中的RTP初始化示意圖;圖7是圖5所示實(shí)施例中的DTP初始化示意圖;圖8是圖5所示實(shí)施例的JAVA卡數(shù)據(jù)處理的示意圖;圖9是根據(jù)本申請(qǐng)實(shí)施例四的一種JAVA卡的數(shù)據(jù)處理裝置的結(jié)構(gòu)框圖。
具體實(shí)施例方式為使本申請(qǐng)的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí) 施方式對(duì)本申請(qǐng)作進(jìn)一步詳細(xì)的說(shuō)明。實(shí)施例一參照?qǐng)D2,示出了根據(jù)本申請(qǐng)實(shí)施例一的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程 圖。本實(shí)施例的JAVA卡的數(shù)據(jù)處理方法用于在內(nèi)存中訪問(wèn)靜態(tài)全局變量,包括以下 步驟步驟S202 :為靜態(tài)全局變量設(shè)置內(nèi)存屬性。其中,所述內(nèi)存屬性用于指示在JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行與內(nèi) 存屬性相對(duì)應(yīng)的處理。本步驟中,對(duì)于那些無(wú)須長(zhǎng)時(shí)間或永久保存的靜態(tài)全局變量的數(shù)據(jù),為其設(shè)置內(nèi) 存屬性,以指示對(duì)其的處理(如讀、寫、刪除、修改等等)在內(nèi)存中進(jìn)行,無(wú)須再多次、重復(fù)地 訪問(wèn) EEPR0M。步驟S204 :根據(jù)內(nèi)存屬性確定靜態(tài)全局變量在JAVA卡的內(nèi)存中的內(nèi)存地址。當(dāng)一個(gè)靜態(tài)全局變量具有內(nèi)存屬性時(shí),其需要有內(nèi)存地址,以便在內(nèi)存中的相應(yīng) 位置對(duì)其進(jìn)行處理。內(nèi)存地址的獲取有多種方式,比如在確定情況下直接指定靜態(tài)全局變 量在內(nèi)存中的絕對(duì)地址,但更常用的是,指定靜態(tài)全局變量在內(nèi)存中的偏移地址,然后再根 據(jù)內(nèi)存的基地址,確定靜態(tài)全局變量在內(nèi)存中的絕對(duì)地址。步驟S206 :根據(jù)內(nèi)存地址在JAVA卡的內(nèi)存中對(duì)靜態(tài)全局變量進(jìn)行訪問(wèn)。本實(shí)施例通過(guò)為JAVA卡中設(shè)置的靜態(tài)全局變量設(shè)置內(nèi)存屬性,明確了對(duì)靜態(tài)全 局變量的訪問(wèn)(包括寫入、修改、刪除等等),在JAVA卡的內(nèi)存中進(jìn)行。進(jìn)而根據(jù)該內(nèi)存屬 性,獲取具有該屬性的靜態(tài)全局變量在JAVA卡內(nèi)存中的地址,從而實(shí)現(xiàn)了在JAVA卡的內(nèi) 存中對(duì)靜態(tài)全局變量的處理,避免了多次、反復(fù)訪問(wèn)EEPR0M造成的耗時(shí)和低效率,提高了 JAVA卡開(kāi)發(fā)和JAVA程序執(zhí)行的效率。CN 102591787 A說(shuō)明書(shū)3/9 頁(yè)
對(duì)靜態(tài)全局變量的處理,避免了多次、反復(fù)訪問(wèn)EEPR0M造成的耗時(shí)和低效率,提高了 JAVA 卡開(kāi)發(fā)和JAVA程序執(zhí)行的效率。
實(shí)施例二參照?qǐng)D3,示出了根據(jù)本申請(qǐng)實(shí)施例二的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程圖。本實(shí)施例的JAVA卡的數(shù)據(jù)處理方法用于在內(nèi)存中訪問(wèn)靜態(tài)全局變量,包括以下步驟步驟S302 :為多個(gè)靜態(tài)全局變量設(shè)置內(nèi)存屬性。步驟S304 :使用一個(gè)數(shù)組放置多個(gè)靜態(tài)全局變量。該數(shù)組具有一個(gè)數(shù)組標(biāo)識(shí),如數(shù)組ID。需要說(shuō)明的是,當(dāng)靜態(tài)全局變量較多時(shí),可以使用多個(gè)數(shù)組,每個(gè)數(shù)組都具有一個(gè)數(shù)組標(biāo)識(shí)。優(yōu)選地,使用臨時(shí)數(shù)組,既可以滿足實(shí)際需要,又不會(huì)長(zhǎng)時(shí)間占用空間。步驟S306 :將該數(shù)組以對(duì)象的形式存儲(chǔ)到EEPROM中。其中,該數(shù)組對(duì)象中存儲(chǔ)有該數(shù)組中每個(gè)靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址。若有多個(gè)數(shù)組,則每個(gè)數(shù)組都以對(duì)象的形式存儲(chǔ)到EEPROM中,每個(gè)數(shù)組對(duì)象中存儲(chǔ)有該數(shù)組中每個(gè)靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址。步驟S308 :使用數(shù)組標(biāo)識(shí)生成對(duì)象表,對(duì)象表中的每一個(gè)數(shù)組標(biāo)識(shí)指向該數(shù)組標(biāo)識(shí)所標(biāo)識(shí)的數(shù)組在EEPROM中存儲(chǔ)的數(shù)組對(duì)象的地址。該步驟為可選步驟,尤其適用于存在多個(gè)數(shù)組的情形。使用每個(gè)數(shù)組的數(shù)組標(biāo)識(shí)生成對(duì)象表,獲取靜態(tài)全局變量在JAVA卡中的內(nèi)存地址時(shí),先通過(guò)該靜態(tài)全局變量所在數(shù)組的數(shù)組標(biāo)識(shí),在對(duì)象表中找到該數(shù)組的數(shù)組對(duì)象在EEPROM中的地址,然后再?gòu)脑摂?shù)組對(duì)象中獲取靜態(tài)全局變量的內(nèi)存偏移地址。通過(guò)對(duì)象表,在數(shù)組較多時(shí),可以方便地對(duì)數(shù)組在EEPROM中對(duì)應(yīng)的數(shù)組對(duì)象進(jìn)行組織和管理,提高JAVA卡的數(shù)據(jù)訪問(wèn)和處理效率。步驟S310 :當(dāng)需要對(duì)一個(gè)靜態(tài)全局變量進(jìn)行處理時(shí),若確定該靜態(tài)全局變量具有內(nèi)存屬性,則進(jìn)行后續(xù)處理。步驟S312 :確定該靜態(tài)全局變量所在的數(shù)組,獲取該數(shù)組的數(shù)組標(biāo)識(shí)。步驟S314 :根據(jù)該數(shù)組的數(shù)組標(biāo)識(shí),通過(guò)對(duì)象表確定該數(shù)組對(duì)應(yīng)的數(shù)組對(duì)象在 EEPROM中的地址。步驟S316 :從確定的EEPROM地址的數(shù)組對(duì)象中獲取該數(shù)組在JAVA卡內(nèi)存中的偏移地址。步驟S318 :結(jié)合獲得的偏移地址和內(nèi)存基地址,確定靜態(tài)全局變量在內(nèi)存中的內(nèi)存地址,即絕對(duì)地址。步驟S320 :在該內(nèi)存地址對(duì)該靜態(tài)全局變量進(jìn)行處理。如寫入、修改、刪除等。上述JAVA卡的數(shù)據(jù)處理方法的整體流程如圖4所示。在圖4中,系統(tǒng)定義一個(gè)臨時(shí)數(shù)組,用該數(shù)組的下標(biāo)來(lái)表示靜態(tài)全局變量,數(shù)組以對(duì)象的形式存儲(chǔ)在EEPROM里的對(duì)象表里,從對(duì)象表可以獲得該數(shù)組的ID號(hào),通過(guò)ID號(hào)可以找到數(shù)組對(duì)象,數(shù)組對(duì)象中存儲(chǔ)有該數(shù)組每個(gè)變量在內(nèi)存中的偏移地址,通過(guò)偏移地址找到內(nèi)存中變量相對(duì)應(yīng)的地址。具體訪問(wèn)變量的過(guò)程是,首先要找到這個(gè)變量所在的數(shù)組在對(duì)象表中的ID號(hào),通過(guò)這個(gè)ID號(hào)找到相應(yīng)的數(shù)組對(duì)象在EEPROM中的地址,然后通過(guò)對(duì)象找到全局靜態(tài)變量存放在RAM中的具體地址。通過(guò)這種方式,在訪問(wèn)(讀)靜態(tài)全局變量時(shí)因需要訪問(wèn)EEPROM的對(duì)象表,因此并沒(méi)有節(jié)省時(shí)間,但是在為靜態(tài)全局變量賦值(寫變量)時(shí),因?yàn)閷懖僮鞯氖莾?nèi)存空間,所以節(jié)省了大量時(shí)間。從而在解決EEPROM中讀寫變量帶來(lái)的效率問(wèn)題時(shí),盡可能地減少了讀寫EEPROM的操作,相應(yīng)地提高了 JAVA卡開(kāi)發(fā)和JAVA程序執(zhí)行的效率。實(shí)施例三參照?qǐng)D5,示出了根據(jù)本申請(qǐng)實(shí)施例三的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程圖。本實(shí)施例以具體JAVA開(kāi)發(fā)為例,說(shuō)明JAVA卡的數(shù)據(jù)處理方法,包括以下步驟步驟S502 :為靜態(tài)全局變量設(shè)置內(nèi)存屬性。首先,為字段(field,也即變量,該處字段是指靜態(tài)全局變量形式的字段)添加一個(gè)annotation屬性(內(nèi)存屬性),屬性的值分別為COD(clear_on_deselect)或C0R(clear_ on_reset)。COD或COR屬性,使得在生成JAVA類文件時(shí),會(huì)在被聲明字段的annotation屬性中出現(xiàn)COD值或COR值。通常,在JAVA類文件中,一個(gè)attribute (屬性)是以一個(gè)attribute_info (屬性
信息)結(jié)構(gòu)來(lái)表示的,該結(jié)構(gòu)如下所示
attribute—info {
u2 attribute—name—index u4 attribute—length u I info [attribute—length]
}在設(shè)置內(nèi)存屬性,即annotation屬性時(shí),可以在JAVA類文件格式中的attributes 屬性中添加一個(gè)RuntimeAnnotation屬性。這個(gè)RuntimeAnnotation只可能在field— info(字段信息)結(jié)構(gòu)的attribute!!]數(shù)組中看到這個(gè)RuntimeAnnotation屬性。也就是說(shuō),RuntimeAnnotation屬性是用來(lái)定義class (類)或interface (接口)中某個(gè)field (字段)的性質(zhì)的。如果某個(gè)field擁有static (靜態(tài))特性,并且想把該field分配到COD或COR 空間(C0D和COR均為內(nèi)存空間)中,那么在代表該field的field—info結(jié)構(gòu)中就會(huì)使用一個(gè),并且是唯一的一個(gè)RuntimeAnnotation屬性來(lái)代表該static field的值是COD還是 COR0在為字段定義了 annotation屬性后,如果某個(gè)字段的attribute (屬性)是個(gè) RuntimeAnnotation屬性的話,之前的attribute—info結(jié)構(gòu)可更詳細(xì)地解釋為如下所示attribute—info {
u2 attribute—name—index u4 attribute」ength u2 mntimeannotation—index
}其中,attribute_name_index代表一個(gè)指到 constant_pool []數(shù)組中某
個(gè)項(xiàng)目的索引值,通過(guò)這個(gè)項(xiàng)目可以找到代表這個(gè)attribute (屬性)的名字-
RunteimeAnnotation0 attribute_length 在 RuntimeAnnotation 屬性結(jié)構(gòu)中的 attribute_length 等于 14,表不接下來(lái)存儲(chǔ)了 14 個(gè) bytes 的信息。runtimeannotation_ index代表一個(gè)指到constant_pool []數(shù)組中某個(gè)項(xiàng)目的索引值,通過(guò)這個(gè)項(xiàng)目可以找到這個(gè)runtimeannotation屬性所屬的field_info結(jié)構(gòu)所代表的static field是COD還是 COR空間的數(shù)據(jù)。步驟S504 :生成具有COD或COR屬性的類文件。在JAVA 類文件格式中的 ClassFile, field_info,以及 method_info, Code_ attributes結(jié)構(gòu)中都會(huì)使用到attributes (屬性)。在定義了上述內(nèi)存屬性后,將會(huì)生成具有內(nèi)存屬性,即上述定義的COD或COR屬性的類文件。步驟S506 生成JCA文件。JCA(Java Connector Architecture,或 J2EE Connector Architecture)即 Java 連接器體系,是J2EE體系架構(gòu)的一部分,為開(kāi)發(fā)人員提供了一套連接各種異類的企業(yè)信息系統(tǒng)的體系架構(gòu)。本實(shí)施例中,通過(guò)converter (轉(zhuǎn)換)工具來(lái)解析生成的類文件的field_info,最后把帶有COD和COR屬性的字段信息輸出到JCA文件中。以步驟S502中為字段定義的runtimeannotation屬性為例,若某個(gè)字段為靜態(tài)字段,且定義了 runtimeannotation屬性,則生成的類文件中包括該字段的 runtimeannotation屬性信息,即存在如下信息
attribute—info {
u2 attribute—name—index u4 attribute」ength u2 mntimeannotation—index
}在解析類文件時(shí),先找到類文件中的field信息;解析其靜態(tài)域;判斷該靜態(tài)域是否具有 COD 或 COR 屬性(attribute_info 屬性結(jié)構(gòu)中 runtimeannotation_index 代表一個(gè)指到constant_pool []數(shù)組中某個(gè)項(xiàng)目的索引值,通過(guò)這個(gè)項(xiàng)目可以找到這個(gè) runtimeannotation 屬性所屬的 field_info 結(jié)構(gòu)所代表的 static field 是 COD 還是 COR 空間的數(shù)據(jù));在輸出JCA文件時(shí)將靜態(tài)域的COD或COR屬性輸出,即完成了 JCA文件的處理。在對(duì)類文件進(jìn)行了解析后,生成的JCA文件中是否定義了 COD或COR的static field的field結(jié)構(gòu)分別如下其中,沒(méi)有定義COD或COR的field結(jié)構(gòu)如下
fields {
static byte ramField; "B static byte ramFieldCor=0; //B
}
定義了 COD或COR的field結(jié)構(gòu)如下
fields {
static byte ramField COD; //B static byte ramFieldCor=0 COR; //B
}步驟S508 :生成mask(掩模)文件。通過(guò)將輸入的JCA文件進(jìn)行轉(zhuǎn)化解析來(lái)生成mask文件,其中包括解析每個(gè)包的 field信息,如果field具有COR屬性,則存儲(chǔ)靜態(tài)全局變量在COR空間中的偏移值;如果 field具有COD屬性,則存儲(chǔ)靜態(tài)全局變量在指定邏輯通道所對(duì)應(yīng)的COD空間上的偏移。在輸出mask文件中字節(jié)碼時(shí),如果是操作靜態(tài)field的字節(jié)碼,貝U判斷field是否是COD或是COR空間的,如果是,則將當(dāng)前的這條字節(jié)碼替換成對(duì)應(yīng)的操作COD或COR的私有字節(jié)碼指令。優(yōu)選地,在mask文件中要輸出COR靜態(tài)字段的總的偏移值,以便以后在COR分配內(nèi)存對(duì)象時(shí)以總的偏移值為基址向后分配空間,如圖6所示,總的偏移值用來(lái)初始化 RTP (C0R已分配的空間的偏移,從O開(kāi)始)的值。優(yōu)選地,mask文件要輸出每個(gè)APPLET包中的COD靜態(tài)field總的偏移值,然后會(huì)按包的上下文ID來(lái)輸出每個(gè)包的COD靜態(tài)field總的偏移值,以便以后在COD空間分配內(nèi)存對(duì)象時(shí)以總的偏移值為基址向后分配空間,如圖7所示,總的偏移值用來(lái)初始化DTP (DTP 是APPLET包所對(duì)應(yīng)的COD空間己分配的偏移,從O開(kāi)始)的值。通過(guò)輸出總的偏移值,為下一次靜態(tài)全局變量的內(nèi)存分配提供了參考和依據(jù),提高了靜態(tài)全局變量?jī)?nèi)存分配的速度和效率。步驟S510 :初始化RTP和DTP的值。在將mask文件寫到rom后,會(huì)讀出靜態(tài)field對(duì)應(yīng)COR空間的總偏移值,用這個(gè)值來(lái)初始化RTP。然后,讀出每個(gè)APPLET包中的COD靜態(tài)field總的偏移值來(lái)初始化每個(gè) DTP值(DTP共有16個(gè))。步驟S512 :靜態(tài)域字節(jié)碼的操作。包括(I)靜態(tài)域字節(jié)碼的處理過(guò)程中會(huì)將標(biāo)示COR或COD的標(biāo)志讀出來(lái),也會(huì)讀
10出靜態(tài)域相對(duì)于COR或COD空間的偏移值。(2)判斷靜態(tài)域是COR還是C0D,如果靜態(tài)域是COR空間的則獲取COR的基地址,用這個(gè)基地址加上讀取出的偏移值,便是操作變量的地址;如果靜態(tài)域是COD空間的則根據(jù)當(dāng)前的通道ID號(hào),根據(jù)這個(gè)ID號(hào)確定是哪塊COD空間并得到這塊COD空間的基地址,用這個(gè)基地址加上讀取出的偏移值,便是操作變量的地址。上述JAVA卡的數(shù)據(jù)處理方法的示意流程如圖8所示。在圖8中,系統(tǒng)定義具有內(nèi)存屬性的靜態(tài)全局變量,通過(guò)這個(gè)屬性可以得知該變量是存儲(chǔ)在內(nèi)存空間中的,每個(gè)變量映射到一個(gè)屬于自己的偏移地址,通過(guò)這個(gè)偏移地址可以找到內(nèi)存中變量相對(duì)應(yīng)的地址。訪問(wèn)變量時(shí),通過(guò)變量對(duì)應(yīng)的偏移地址計(jì)算出變量的絕對(duì)地址,這個(gè)地址是存儲(chǔ)在內(nèi)存空間中的。因?yàn)樽兞渴谴鎯?chǔ)在內(nèi)存中的,所以讀寫變量時(shí)就是在操作內(nèi)存,這樣要比讀寫 EEPROM節(jié)省大量的時(shí)間,同時(shí)比實(shí)施例二的方案節(jié)省了占用EEPROM的空間。具體實(shí)現(xiàn)時(shí),可以通過(guò)自定義私有指令的方法來(lái)實(shí)現(xiàn),包括將靜態(tài)全局變量直接指定到內(nèi)存的COD或COR空間中(簡(jiǎn)稱內(nèi)存靜態(tài)變量),通過(guò)添加私有指令來(lái)操作COD或 COR中的靜態(tài)變量。這樣做的優(yōu)點(diǎn)是1、使用方便,只需用一個(gè)@符號(hào)和一個(gè)COD或COR字符來(lái)確定靜態(tài)變量是COD還是COR空間;2、操作內(nèi)存靜態(tài)變量時(shí)可以通過(guò)靜態(tài)變量在COD 或COR中的偏移值來(lái)直接找到變量。本實(shí)施例中,將靜態(tài)全局變量定義到內(nèi)存中,通過(guò)靜態(tài)全局變量在內(nèi)存中的偏移值來(lái)訪問(wèn)靜態(tài)全局變量;并且,通過(guò)屬性來(lái)識(shí)別靜態(tài)域是在COD空間還是在COR空間,并通過(guò)轉(zhuǎn)換工具輸出到MASK文件,進(jìn)而實(shí)現(xiàn)了靜態(tài)全局變量的內(nèi)存處理。本實(shí)施例通過(guò)對(duì)空間和性能的分析,將靜態(tài)全局變量直接指定到內(nèi)存中,與實(shí)施例二的方案相比,既能節(jié)省訪問(wèn)變量的時(shí)間又能節(jié)省變量賦值的時(shí)間,并且可以節(jié)省占用 EEPROM的空間,提高了空間使用率和執(zhí)行速度。實(shí)施例四參照?qǐng)D9,示出了根據(jù)本申請(qǐng)實(shí)施例四的一種JAVA卡的數(shù)據(jù)處理裝置的結(jié)構(gòu)框圖。本實(shí)施例的JAVA卡的數(shù)據(jù)處理裝置用于在內(nèi)存中訪問(wèn)靜態(tài)全局變量,包括設(shè)置模塊902,用于為靜態(tài)全局變量設(shè)置內(nèi)存屬性,以指示在JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行與內(nèi)存屬性相對(duì)應(yīng)的處理;獲取模塊904,用于根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在JAVA卡的內(nèi)存中的內(nèi)存地址;處理模塊906,用于根據(jù)所述內(nèi)存地址在JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行訪問(wèn)。優(yōu)選地,獲取模塊904包括第一地址獲取模塊9042,用于根據(jù)內(nèi)存屬性從JAVA 卡的EEPROM中獲取靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址;第二地址獲取模塊 9044,用于根據(jù)偏移地址確定靜態(tài)全局變量在JAVA卡的內(nèi)存中的內(nèi)存地址。優(yōu)選地,本實(shí)施例的JAVA卡的數(shù)據(jù)處理裝置還包括數(shù)組模塊908,用于在第一地址獲取模塊9042根據(jù)內(nèi)存屬性從JAVA卡的EEPROM中獲取靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址之前,使用至少一個(gè)數(shù)組表示多個(gè)靜態(tài)全局變量,每個(gè)數(shù)組具有一個(gè)數(shù)組標(biāo)識(shí);將每個(gè)數(shù)組以對(duì)象的形式存儲(chǔ)到EEPROM中,每個(gè)數(shù)組對(duì)象中存儲(chǔ)有該數(shù)組中每個(gè)靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址。優(yōu)選地,數(shù)組模塊908還用于,在將每個(gè)數(shù)組以對(duì)象的形式存儲(chǔ)到EEPROM中之后, 使用數(shù)組標(biāo)識(shí)生成對(duì)象表,對(duì)象表中的每一個(gè)數(shù)組標(biāo)識(shí)指向該數(shù)組標(biāo)識(shí)所標(biāo)識(shí)的數(shù)組在EEPROM中存儲(chǔ)的數(shù)組對(duì)象的地址。優(yōu)選地,第一地址獲取模塊9042,用于獲取靜態(tài)全局變量所在數(shù)組的數(shù)組標(biāo)識(shí); 根據(jù)該數(shù)組標(biāo)識(shí)從對(duì)象表中獲取該數(shù)組在EEPROM中存儲(chǔ)的數(shù)組對(duì)象的地址;根據(jù)該數(shù)組對(duì)象的地址,獲取該地址的數(shù)組對(duì)象中的靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址。優(yōu)選地,本實(shí)施例的JAVA卡的數(shù)據(jù)處理裝置還包括類生成模塊910,用于在設(shè)置模塊902為靜態(tài)全局變量設(shè)置內(nèi)存屬性之后,生成包括所述靜態(tài)全局變量的JAVA類文件; 對(duì)JAVA類文件進(jìn)行解析,輸出所述靜態(tài)全局變量的內(nèi)存屬性。優(yōu)選地,獲取模塊904包括地址指定模塊9046,用于根據(jù)內(nèi)存屬性,為靜態(tài)全局變量指定在JAVA卡的內(nèi)存中的偏移地址;第三地址獲取模塊9048,用于根據(jù)指定的偏移地址確定靜態(tài)全局變量在JAVA卡的內(nèi)存中的內(nèi)存地址。優(yōu)選地,獲取模塊904還包括替換模塊90410,用于在地址指定模塊9046根據(jù)內(nèi)存屬性,為靜態(tài)全局變量指定在JAVA卡的內(nèi)存中的偏移地址后,使用設(shè)置的私有字節(jié)碼指令替換對(duì)靜態(tài)全局變量進(jìn)行處理的原字節(jié)碼指令,私有字節(jié)碼指令用于在JAVA卡的內(nèi)存中操作靜態(tài)全局變量。優(yōu)選地,本實(shí)施例的JAVA卡的數(shù)據(jù)處理裝置還包括總偏移輸出模塊912,用于若存在多個(gè)靜態(tài)全局變量,則在第三地址獲取模塊9048根據(jù)偏移地址獲取靜態(tài)全局變量在 JAVA卡的內(nèi)存中的內(nèi)存地址之前或之后,獲取多個(gè)靜態(tài)全局變量的總偏移值,作為下一次指定具有內(nèi)存屬性的靜態(tài)全局變量偏移地址的基址。本實(shí)施例的JAVA卡的數(shù)據(jù)處理裝置用于實(shí)現(xiàn)前述多個(gè)方法實(shí)施例中相應(yīng)的JAVA 卡數(shù)據(jù)處理方法,并具有相應(yīng)的JAVA卡數(shù)據(jù)處理方法的有益效果,在此不再贅述。通過(guò)本申請(qǐng)的JAVA卡數(shù)據(jù)處理方案,提供了一種將EEPROM中的靜態(tài)全局變量轉(zhuǎn)換成內(nèi)存變量的實(shí)現(xiàn)方式,解決了在EEPROM中讀寫變量帶來(lái)的效率問(wèn)題,盡量減少了讀寫 EEPROM的操作,避免了多次、反復(fù)訪問(wèn)EEPROM造成的耗時(shí)和低效率,提高了 JAVA卡開(kāi)發(fā)和 JAVA程序執(zhí)行的效率。本說(shuō)明書(shū)中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說(shuō)明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似的部分互相參見(jiàn)即可。對(duì)于裝置實(shí)施例而言,由于其與方法實(shí)施例基本相似,所以描述的比較簡(jiǎn)單,相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。以上對(duì)本申請(qǐng)所提供的一種JAVA卡的數(shù)據(jù)處理方法和裝置,進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本申請(qǐng)的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本申請(qǐng)的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請(qǐng)的思想,在具體實(shí)施方式
及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說(shuō)明書(shū)內(nèi)容不應(yīng)理解為對(duì)本申請(qǐng)的限制。
權(quán)利要求
1.一種JAVA卡的數(shù)據(jù)處理方法,其特征在于,用于在內(nèi)存中訪問(wèn)靜態(tài)全局變量,包括 為靜態(tài)全局變量設(shè)置內(nèi)存屬性,用于指示在JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行與所述內(nèi)存屬性相對(duì)應(yīng)的處理;根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址;根據(jù)所述內(nèi)存地址在所述JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行訪問(wèn)。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟包括根據(jù)所述內(nèi)存屬性從所述JAVA卡的電可擦可編程只讀存儲(chǔ)器EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址;根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,在所述根據(jù)所述內(nèi)存屬性從所述JAVA卡的EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址的步驟之前,還包括使用至少一個(gè)數(shù)組表示多個(gè)所述靜態(tài)全局變量,每個(gè)所述數(shù)組具有一個(gè)數(shù)組標(biāo)識(shí); 將每個(gè)所述數(shù)組以對(duì)象的形式存儲(chǔ)到所述EEPROM中,每個(gè)數(shù)組對(duì)象中存儲(chǔ)有該數(shù)組中每個(gè)所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,在所述將每個(gè)所述數(shù)組以對(duì)象的形式存儲(chǔ)到所述EEPROM中的步驟之后,還包括使用所述數(shù)組標(biāo)識(shí)生成對(duì)象表,所述對(duì)象表中的每一個(gè)所述數(shù)組標(biāo)識(shí)指向該數(shù)組標(biāo)識(shí)所標(biāo)識(shí)的數(shù)組在所述EEPROM中存儲(chǔ)的數(shù)組對(duì)象的地址。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述根據(jù)所述內(nèi)存屬性從EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址的步驟包括獲取所述靜態(tài)全局變量所在數(shù)組的數(shù)組標(biāo)識(shí);根據(jù)該數(shù)組標(biāo)識(shí)從所述對(duì)象表中獲取該數(shù)組在所述EEPROM中存儲(chǔ)的數(shù)組對(duì)象的地址;根據(jù)該數(shù)組對(duì)象的地址,獲取該地址的數(shù)組對(duì)象中的所述靜態(tài)全局變量在所述JAVA 卡的內(nèi)存中的偏移地址。
6.根據(jù)權(quán)利要求I所述的方法,其特征在于,在所述為靜態(tài)全局變量設(shè)置內(nèi)存屬性的步驟之后,還包括生成包括所述靜態(tài)全局變量的JAVA類文件;對(duì)所述JAVA類文件進(jìn)行解析,輸出所述靜態(tài)全局變量的內(nèi)存屬性。
7.根據(jù)權(quán)利要求I或6所述的方法,其特征在于,所述根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟包括根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址; 根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,在所述根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址的步驟之后,還包括使用設(shè)置的私有字節(jié)碼指令替換對(duì)所述靜態(tài)全局變量進(jìn)行處理的原字節(jié)碼指令,所述私有字節(jié)碼指令用于在所述JAVA卡的內(nèi)存中操作所述靜態(tài)全局變量。
9.根據(jù)權(quán)利要求7所述的方法,其特征在于,若存在多個(gè)所述靜態(tài)全局變量,則在所述根據(jù)偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟之前或之后,還包括獲取所述多個(gè)靜態(tài)全局變量的總偏移值,作為下一次指定具有所述內(nèi)存屬性的靜態(tài)全局變量偏移地址的基址。
10.一種JAVA卡的數(shù)據(jù)處理裝置,其特征在于,用于在內(nèi)存中訪問(wèn)靜態(tài)全局變量,所述裝置包括設(shè)置模塊,用于為靜態(tài)全局變量設(shè)置內(nèi)存屬性,以指示在JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行與所述內(nèi)存屬性相對(duì)應(yīng)的處理;獲取模塊,用于根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址;處理模塊,用于根據(jù)所述內(nèi)存地址在所述JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行訪問(wèn)。
11.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述獲取模塊包括第一地址獲取模塊,用于根據(jù)所述內(nèi)存屬性從所述JAVA卡的電可擦可編程只讀存儲(chǔ)器EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址;第二地址獲取模塊,用于根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。
12.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述獲取模塊包括地址指定模塊,用于根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址;第三地址獲取模塊,用于根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。
全文摘要
本申請(qǐng)?zhí)峁┝艘环NJAVA卡的數(shù)據(jù)處理方法及裝置,其中,JAVA卡的數(shù)據(jù)處理方法用于在內(nèi)存中訪問(wèn)靜態(tài)全局變量,包括為靜態(tài)全局變量設(shè)置內(nèi)存屬性,用于指示在JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行與所述內(nèi)存屬性相對(duì)應(yīng)的處理;根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址;根據(jù)所述內(nèi)存地址在所述JAVA卡的內(nèi)存中對(duì)所述靜態(tài)全局變量進(jìn)行訪問(wèn)。通過(guò)本申請(qǐng),避免了多次、反復(fù)訪問(wèn)EEPROM造成的耗時(shí)和低效率,提高了JAVA卡開(kāi)發(fā)和JAVA程序執(zhí)行的效率。
文檔編號(hào)G06F12/02GK102591787SQ201110427789
公開(kāi)日2012年7月18日 申請(qǐng)日期2011年12月19日 優(yōu)先權(quán)日2011年12月19日
發(fā)明者董吉昌 申請(qǐng)人:北京握奇數(shù)據(jù)系統(tǒng)有限公司