版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Java卡虛擬機(jī)規(guī)范(中文譯本)第2.2.1版北京明宇科技有限公司2004年06月14日J(rèn)ava卡虛擬機(jī)規(guī)范 V2.2.1修改記錄版本日期修改者修改內(nèi)容0.12004/06/14新建Java卡虛擬機(jī)規(guī)范 V2.2.1目錄1.介紹11.1.動機(jī)11.2.Java卡虛擬機(jī)11.3.Java語言安全31.4.Java卡運(yùn)行環(huán)境安全32.Java虛擬機(jī)子集42.1.為什么需要一個子集42.2.Java卡語言子集42.2.1.不支持項目.不支持的特性.關(guān)鍵字.不支持的類型.類52.2.2.支持的項目.特性.關(guān)
2、鍵字.類型.類72.2.3.可選支持項.整數(shù)數(shù)據(jù)類型.對象刪除機(jī)制72.2.4.Java卡虛擬機(jī)的限制.包.類.對象.方法.Switch Statements.類初始化92.2.5.多選擇Applet限制92.2.6.Java卡遠(yuǎn)程方法調(diào)用限制.遠(yuǎn)程類和遠(yuǎn)程接口.遠(yuǎn)程接口的訪問控制.參數(shù)和返回值102.3.Java卡虛擬機(jī)子集102.3.1.class文件子集.cl
3、ass文件中不支持項.class文件中支持項112.3.2.字節(jié)碼子集.不支持的字節(jié)碼.支持的字節(jié)碼.字節(jié)碼的靜態(tài)制約132.3.3.異常.未捕獲和不可捕獲的異常.被檢測的異常.運(yùn)行時異常.錯誤163.Java卡虛擬機(jī)結(jié)構(gòu)173.1.數(shù)據(jù)類型和值173.2.字173.3.運(yùn)行時數(shù)據(jù)區(qū)173.4.上下文173.5.框架183.6.對象的表現(xiàn)183.7.特定的初始化方法183.8.異常183.9.二進(jìn)制文件格式183.10.指令集綜述193.10.1.類型
4、和Java卡虛擬機(jī)194.二進(jìn)制表現(xiàn)214.1.Java卡文件格式214.1.1.Export文件格式214.1.2.CAP文件格式214.1.3.Jar文件容器224.2.基于AID的命名224.2.1.AID格式224.2.2.AID用法224.3.基于Token的連接234.3.1.外部可見項234.3.2.私有Token234.3.3.export文件與轉(zhuǎn)換244.3.4.引用(外部和內(nèi)部)244.3.5.安裝和連接244.3.6.Token分配244.3.7.Token詳細(xì).包.類和接口.靜態(tài)域.靜態(tài)方法和構(gòu)造器
5、.實例域2.虛方法2.接口方法274.4.二進(jìn)制兼容性274.5.包版本284.5.1.分配284.5.2.連接285.Export文件格式295.1.Export文件的名字295.2.Jar文件中的限制295.3.所有權(quán)295.4.表現(xiàn)層次295.5.Export文件305.6.常量池315.6.1.CONSTANT_Package315.6.2.CONSTANT_Classref335.6.3.CONSTANT_Integer335.6.4.CONSTANT_Utf8345.7.類和接口345.8.域365.9.方法385.10.屬性395
6、.10.1.ConstantValue屬性406.CAP文件格式416.1.組件模型416.1.1.Jar文件中的限制426.1.2.定義新的組件436.2.安裝436.3.Header組件446.4.Directory組件466.5.Applet組件486.6.Import組件506.7.Constant Pool組件506.7.1.CONSTANT_Classref526.7.2.CONSTANT_InstanceFieldref、CONSTANT_VirtualMethodref、CONSTANT_SuperMethodref536.7.3.CONSTANT_StaticFieldref
7、、CONSTANT_StaticMethodref546.8.Class組件566.8.1.type_erface_info、class_erface_info和class_info共有項60.interface_info項6.class_info項6.implemented_interface_info6.remote_interface_info656.9.Method組件676.9.1.exception_handler_info696.9.2.met
8、hod_info706.10.Static Field組件726.11.Reference Location組件756.12.Export組件766.13.Descriptor組件786.13.1.class_descriptor_info796.13.2.field_descriptor_info816.13.3.method_descriptor_info826.13.4.type_descriptor_info846.14.Debug組件846.14.1.class_debug_info結(jié)構(gòu)8.field_debug_info8.method_debu
9、g_info結(jié)構(gòu)897.Java卡虛擬機(jī)指令集937.1.假設(shè):“必須”的意思937.2.保留的操作碼937.3.虛擬機(jī)錯誤937.4.安全異常947.5.Java卡虛擬機(jī)指令集947.5.1.aaload967.5.2.aastore967.5.3.aconst_null987.5.4.aload987.5.5.aload_<n>987.5.6.anewarray997.5.7.areturn997.5.8.arraylength1007.5.9.astore1007.5.10.astore_<n>1017.5.11.athrow1017.5.12.baload102
10、7.5.13.bastore1027.5.14.bipush1037.5.15.bspush1037.5.16.checkcast1047.5.17.dup1057.5.18.dup_x1067.5.19.dup21067.5.20.getfield_<t>1077.5.21.getfield_<t>_this1087.5.22.getfield_<t>_w1097.5.23.getstatic_<t>1107.5.24.goto1107.5.25.goto_w1117.5.26.i2b1117.5.27.i2s1127.5.28.iadd112
11、7.5.29.iaload1137.5.30.iand1137.5.31.iastore1147.5.32.icmp1147.5.33.iconst_<i>1157.5.34.idiv1157.5.35.if_acmp<cond>1167.5.36.if_acmp<cond>_w1167.5.37.if_scmp<cond>1177.5.38.if_scmp<cond>_w1177.5.39.if<cond>1187.5.40.if<cond>_w1197.5.41.ifnonnull1207.5.42.ifn
12、onnull_w1207.5.43.ifnull1217.5.44.ifnull_w1217.5.45.iinc1217.5.46.iinc_w1227.5.47.iipush1227.5.48.iload1237.5.49.iload_<n>1237.5.50.ilookupswitch1247.5.51.imul1257.5.52.ineg1257.5.53.instanceof1267.5.54.invokeinterface1277.5.55.invokespecial1287.5.56.invokestatic1297.5.57.invokevirtual1307.5.5
13、8.ior1317.5.59.irem1317.5.60.ireturn1327.5.61.ishl1327.5.62.ishr1327.5.63.istore1337.5.64.istore_<n>1337.5.65.isub1347.5.66.itableswitch1347.5.67.iushr1357.5.68.ixor1367.5.69.jsr1367.5.70.new1377.5.71.newarray1377.5.72.nop1387.5.73.pop1387.5.74.pop21397.5.75.putfield_<t>1397.5.76.putfiel
14、d_<t>_this1407.5.77.putfield_<t>_w1417.5.78.putstatic_<t>1427.5.79.ret1437.5.80.return1447.5.81.s2b1447.5.82.s2i1457.5.83.sadd1457.5.84.saload1457.5.85.sand1467.5.86.sastore1467.5.87.sconst_<s>1477.5.88.sdiv1477.5.89.sinc1487.5.90.sinc_w1487.5.91.sipush1497.5.92.sload1497.5.9
15、3.sload_<n>1497.5.94.slookupswitch1507.5.95.smul1517.5.96.sneg1517.5.97.sor1527.5.98.srem1527.5.99.sreturn1527.5.100.sshl1537.5.101.sshr1537.5.102.sspush1547.5.103.sstore1547.5.104.sstore_<n>1557.5.105.ssub1557.5.106.stableswitch1557.5.107.sushr1567.5.108.swap_x1577.5.109.sxor1578.指令集表15
16、99.Gloassary164圖目錄圖 1:Java卡API包轉(zhuǎn)換2圖 2:Java卡API包安裝2圖 3:AID格式22圖 4:包標(biāo)識符與AID的對應(yīng)23圖 5:二進(jìn)制兼容性例子27圖 6:指令格式描述示例95表目錄表 1:不支持的關(guān)鍵字5表 2:被支持的關(guān)鍵字6表 3:不支持的Java 常量池tag11表 4:支持的Java 常量池tag12表 5:不支持的字節(jié)碼12表 6:支持的字節(jié)碼13表 7:對java檢測異常的支持15表 8:對java運(yùn)行時異常的支持15表 9:對java錯誤的支持16表 10:在Java Card虛擬機(jī)指令集中的類型支持20表 11:存儲類型和計算類型20表 1
17、2:token值域、類型和范圍25表 13:實例域的token26表 14:Export文件常量池tag31表 15:Export文件包的flags32表 16:Export文件類訪問和修飾符標(biāo)志35表 17:Export文件域訪問和修飾符標(biāo)志37表 18:Export文件方法訪問和修飾符標(biāo)志39表 19:CAP文件組件tag42表 20:CAP文件組件文件名42表 21:參考組件安裝順序43表 22:CAP文件包的flags45表 23:CAP文件constant pool的tag51表 24:類型描述符的值58表 25:被編碼的引用類型p1.c159表 26:被編碼的字節(jié)數(shù)組類型59表 2
18、7:被編碼的引用數(shù)組類型p1.c159表 28:被編碼的方法的標(biāo)記()V59表 29:被編碼的方法標(biāo)記(Lp1.c1;)S59表 30:CAP文件接口和類標(biāo)志61表 31:CAP文件方法標(biāo)志71表 32:靜態(tài)域映像的段72表 33:靜態(tài)域長度73表 34:數(shù)組類型74表 35:1字節(jié)refrence location例子76表 36:CAP文件類描述符標(biāo)志80表 37:CAP文件域描述符標(biāo)志81表 38:基本類型描述符的值82表 39:CAP文件方法描述符標(biāo)志83表 40:類訪問和修飾符標(biāo)志86表 41:域訪問和修飾符標(biāo)志89表 42:方法修飾符標(biāo)志90表 43:數(shù)組值104表 44:數(shù)組值1
19、26表 45:數(shù)組值138表 46:按操作碼值組織的指令159表 47:按操作碼助記符組織的指令1611711. 介紹1.1. 動機(jī)Java卡技術(shù)允許用Java語言編寫的程序運(yùn)行在智能卡和其它小型的、資源有限的設(shè)備上。開發(fā)者能夠使用標(biāo)準(zhǔn)的軟件開發(fā)工具和環(huán)境建立并測試程序,然后將這些程序轉(zhuǎn)換成一種能夠安裝到Java卡技術(shù)支持的設(shè)備上的格式。Java卡平臺的應(yīng)用軟件叫做Applet,更準(zhǔn)確的說是Java卡Applet或卡Applet(不同于瀏覽器中的Applet)。當(dāng)Java卡技術(shù)允許用Java語言編寫的程序運(yùn)行在智能卡上時,這些小型的設(shè)備不能夠得到足夠的電源來支持Java平臺的全部功能。因此,J
20、ava卡平臺只支持一部分精挑細(xì)選的、定制的Java平臺特性的一個子集。這個子集提供了一些特性,這些特性可以很好的適應(yīng)為小型設(shè)備所編寫的程序,并保持了Java編程語言的面向?qū)ο蟮哪芰?。定義一個Java卡虛擬機(jī)的一個簡單的途徑是描述Java虛擬機(jī)的特性的一個子集,這個子集必須支持源碼在所有支持Java卡技術(shù)的設(shè)備上的可移植性。將這個子集規(guī)范與Java虛擬機(jī)規(guī)范中的信息結(jié)合起來,智能卡商能夠構(gòu)造他們自己的基于Java卡技術(shù)的實現(xiàn)(Java卡的實現(xiàn))。雖然那個途徑是可行的,但是它有一個嚴(yán)重的缺點。最終的平臺將失去Java卡Applet的二進(jìn)制碼可移植性這個重要特性。這個定義Java平臺的標(biāo)準(zhǔn)允許Jav
21、a程序的二進(jìn)制碼在所有的Java平臺實現(xiàn)上具有可移植性。Java程序的“寫一次,可以在任何地方運(yùn)行”的性質(zhì)也許是這個平臺的最重要的特點。建立Java卡平臺的部分動機(jī)就是為智能卡工業(yè)帶來這種二進(jìn)制的可移植性。在這個世界中有上百萬或者上億的智能卡具有不同的處理器和配置,支持軟件分發(fā)的多種二進(jìn)制格式的花費是巨大的。Java卡平臺虛擬機(jī)規(guī)范版本2.2.1是提供二進(jìn)制可移植性的關(guān)鍵。想了解這個規(guī)范是做什么的,一個方法是將之與Java平臺中的相似內(nèi)容進(jìn)行比較。Java虛擬機(jī)規(guī)范定義了一個虛擬機(jī),它是加載Java的class文件并用特定的語義集執(zhí)行它們的一個引擎。class文件是Java結(jié)構(gòu)的一個核心部分,
22、并且它是Java平臺的二進(jìn)制兼容性的標(biāo)準(zhǔn)。Java卡平臺虛擬機(jī)規(guī)范版本2.2.1也定義了一種文件格式,它是Java卡平臺二進(jìn)制兼容性的標(biāo)準(zhǔn):CAP文件格式,它是軟件加載到實現(xiàn)了Java卡虛擬機(jī)的設(shè)備上的格式。1.2. Java卡虛擬機(jī)Java Card虛擬機(jī)這個角色在Java Card平臺軟件制造、開發(fā)的上下文中很好理解。有幾個組件組成了java卡系統(tǒng),包括Java Card虛擬機(jī)、Java Card平臺的Converter(Java卡Converter)、一個終端安裝工具和一個運(yùn)行在設(shè)備上的安裝程序,如圖 1和圖 2所示。圖 1:Java卡API包轉(zhuǎn)換圖 2:Java卡API包安裝Java卡
23、applet的開發(fā)與任何其它的Java程序一樣:開發(fā)者寫一個或多個Java類,用Java編譯器編譯源碼,產(chǎn)生一個或多個class文件。Applet在一個使用模擬工具模擬設(shè)備環(huán)境的工作站上運(yùn)行、測試和調(diào)試。然后,當(dāng)applet準(zhǔn)備被下載到設(shè)備上時,使用Java卡Converter將包含了applet的class文件轉(zhuǎn)換成CAP(converted applet)文件。Java卡Converter將組成Java包的所有class文件作為輸入。包含一個或多個javacard.framework.Applet類的直接或間接的非抽象子類的包被稱為applet包。否則這個包被稱作庫包。Java卡Conve
24、rter也將一個或多個export文件作為輸入。一個export文件包含了將被轉(zhuǎn)換的類所引入的其它包的內(nèi)容的名字和鏈接信息。當(dāng)一個applet包或庫包被轉(zhuǎn)換時,Converter同時也為那個包產(chǎn)生一個export文件。轉(zhuǎn)換后,CAP文件被拷貝到卡終端上,如一臺有讀卡器外設(shè)的臺式計算機(jī)。然后終端上的安裝工具裝載CAP文件,并將它傳送到支持Java卡技術(shù)的設(shè)備上。設(shè)備上的安裝程序接收CAP文件的內(nèi)容,并準(zhǔn)備將被Java Card虛擬機(jī)運(yùn)行的applet。虛擬機(jī)本身不需要下載或處理CAP文件;它只需要執(zhí)行被安裝程序下載到設(shè)備上的CAP文件中的applet代碼。Java Card虛擬機(jī)和安裝程序之間的
25、功能劃分是為了保持虛擬機(jī)和安裝程序都比較小。安裝程序可能被實現(xiàn)為一個Java程序,并在Java卡虛擬機(jī)之上運(yùn)行。因為Java Card平臺的指令(Java卡指令)比典型的機(jī)器碼要更緊湊,所以這可以減小安裝器的尺寸。這種模塊化使不同的安裝器可以和一個單一的Java Card虛擬機(jī)的實現(xiàn)結(jié)合使用。1.3. Java語言安全Java虛擬機(jī)的一個基本特征是由class文件驗證器提供部分的強(qiáng)安全性。許多實現(xiàn)Java卡平臺的設(shè)備可能太小以至于不支持在設(shè)備本身上的CAP文件的驗證。這種考慮導(dǎo)致了一個允許在設(shè)備上進(jìn)行驗證但不能依賴于它的設(shè)計。那些在CAP文件中的僅被驗證所需要的數(shù)據(jù)與那些應(yīng)用執(zhí)行所需的數(shù)據(jù)分別
26、打包。這使得在一個實現(xiàn)中,安全被如何管理具有相當(dāng)?shù)撵`活性。在支持Java Card技術(shù)的設(shè)備上,提供語言級別的安全有幾種選擇。理論上最簡單的(方法)是當(dāng)CAP文件被下載到設(shè)備上時或下載到設(shè)備上后驗證CAP文件的內(nèi)容。這種選擇僅對最大的設(shè)備是可行的。但是,即使在比較小的設(shè)備上,支持一些驗證的子集也是可以的。其它的選擇依賴于以下一項或多項的組合:安裝終端的物理安全,來自CAP文件的源頭的加密增強(qiáng)信任鏈,和對CAP文件內(nèi)容的預(yù)下載驗證。Java Card平臺標(biāo)準(zhǔn)關(guān)于CAP文件安裝和安全策略描述得盡可能少。因為智能卡必須在多種有不同安全需求的系統(tǒng)中充當(dāng)安全處理器,因而有必要提供可滿足智能卡發(fā)行者和用戶
27、需求的較大靈活性。1.4. Java卡運(yùn)行環(huán)境安全Java Card平臺的標(biāo)準(zhǔn)運(yùn)行時環(huán)境是Java Card運(yùn)行時環(huán)境。Java Card RE包括一個Java Card虛擬機(jī)實現(xiàn)和一些Java Card API類。一方面Java Card虛擬機(jī)有確保Java語言級安全的職責(zé),另一方面Java Card RE增加另外的運(yùn)行時安全需求給實現(xiàn)了Java Card RE的設(shè)備,這導(dǎo)致對Java Card虛擬機(jī)一些額外特征的需要。在這份文檔中,這些額外的特征被指定為Java Card RE特有的。Java Card RE所利用的基本的運(yùn)行時安全特征是通過稱為應(yīng)用防火墻的東西,它被用來加強(qiáng)applet之
28、間的隔離。應(yīng)用防火墻能夠阻止一個應(yīng)用創(chuàng)建的對象被另一個應(yīng)用訪問。包括阻止非授權(quán)訪問類實例的域和方法,以及數(shù)組的長度和內(nèi)容。applet的隔離是一個重要的安全特征,但是它要求在需要交互的情形下,允許applet共享對象。Java Card RE通過共享接口對象的概念實現(xiàn)對這種共享的允許。這些對象提供了applet使其對象可為其它applet所用的唯一途徑。對于使用共享接口對象的更多信息,可以參見Java Card平臺應(yīng)用編程接口2.2.1中關(guān)于javacard.framework.Shareable的接口描述。一些關(guān)于防火墻特征相關(guān)的描述將用到shareable接口(的概念)。應(yīng)用防火墻也保護(hù)屬
29、于Java Card RE本身的對象不被非授權(quán)使用。Java Card RE可以使用沒有反映在Java Card API中的機(jī)制使其對象被applet所用。有關(guān)Java Card RE相關(guān)的隔離和共享特征的完整描述可以在Java Card平臺運(yùn)行時環(huán)境規(guī)范2.2.1中找到。2. Java虛擬機(jī)子集本章描述了Java虛擬機(jī)的子集和被Java Card平臺2.2.1支持的語言。2.1. 為什么需要一個子集最理想的情況是:對智能卡的編程如果能夠完全使用Java編程語言。但是Java虛擬機(jī)的完整實現(xiàn)即便是對于當(dāng)今最先進(jìn)的有限資源設(shè)備而言,也是太大了。典型的資源受限設(shè)備有1.2KRAM,16K非易失內(nèi)存
30、(EEPROM 或flash)和32KROM。實現(xiàn)字符串處理的代碼,單精度和雙精度浮點算法,和線程管理對于這樣設(shè)備的ROM而言太大了。即使它是夠用的,那么沒有了留給類庫和應(yīng)用代碼的空間。RAM資源也是非常有限。唯一可行的選擇是:將Java Card技術(shù)作為Java平臺的一個子集來實現(xiàn)。2.2. Java卡語言子集為Java Card平臺所寫的應(yīng)用使用Java編程語言。它們使用Java編譯器來編譯。Java Card技術(shù)使用Java語言子集,理解Java Card平臺需要熟悉Java平臺。在這一章中所討論的內(nèi)容不是基于語言規(guī)范的級別,關(guān)于Java編程語言的完整的文檔,參見Java 語言規(guī)范。2.
31、2.1. 不支持項目本節(jié)所列出的條目是Java編程語言和平臺的元素,但它們在Java Card平臺下不被支持。. 不支持的特性動態(tài)類下載Java Card平臺不支持動態(tài)類下載,Java Card平臺的實現(xiàn)不能動態(tài)地下載類。類或者在生產(chǎn)的過程中被掩模到卡內(nèi),或者在發(fā)卡后通過安裝過程下載。在卡上執(zhí)行的程序僅參照已存在于卡上的類,因為沒有辦法在應(yīng)用代碼正常執(zhí)行的過程中下載類。安全管理器Java Card平臺的安全管理與Java平臺的有很大不同。在Java平臺上,有安全管理器類(java.lang.SecurityManager)來負(fù)責(zé)實現(xiàn)安全特征。在Java Card平臺,語言安全策略
32、由虛擬機(jī)完成。沒有安全管理器類來制定是否允許操作的策略決策。FinalizationFinalization也不被支持。finalize()將無法被Java Card虛擬機(jī)自動調(diào)用。線程Java Card虛擬機(jī)不支持控制的多線程。Java Card平臺的程序(“Java Card 程序”)不能用Java編程語言中的類Thread或任何線程相關(guān)的關(guān)鍵字。CloneJava Card平臺不支持對象克隆。Java Card API類Object沒有實現(xiàn)clone()方法,也不提供Cloneable接口。Java包中的訪問控制Java Card平臺語言子集支持在Java語言中定義的包訪問控制。但是不支
33、持以下各項:l 如果類實現(xiàn)了具有包訪問可見性的方法,子類不能覆蓋這個方法,同時將方法的訪問可見性修改為public或protected。l 如果一個public和protected型的域是一個對包可視類的引用,則這個域不能被公有類包含。l 公有類不能包含一個返回類型為包可視類的引用型的public或protected方法。l 公有類的一個public或protected方法不包含類型為包可視類的引用型的形參。l 被公有類擴(kuò)展的包可視類不能定義任何public或protected方法或域。l 一個被公有類實現(xiàn)的包可視接口不能定義任何域。l 一個包可視接口不能被具有公有訪問可見性的接口擴(kuò)展。2.2
34、.1.2. 關(guān)鍵字以下關(guān)鍵字指出與native方法、線程、浮點、內(nèi)存管理相關(guān)(的內(nèi)容)不被支持。表 1:不支持的關(guān)鍵字nativesynchronized transientvolatilestrictfp. 不支持的類型Java Card平臺不支持類型char、double、float和long。也不支持超過一維的數(shù)組。. 類總的來說,Java Card平臺不支持Java核心API的類。一些來自java.lang包的類被支持(見節(jié)類),但是其它的都不支持。例如:不被支持的類有String、Thread(以及所有線程相關(guān)的類)、例如Boolean,In
35、teger和class等封裝類。系統(tǒng)類java.lang.System不被支持。Java Card技術(shù)提供javacard.framework.JCSystem類,它提供到系統(tǒng)行為的接口。2.2.2. 支持的項目如果一項語言特征沒有被明確表述為不支持,那么是被支持子集的一部分。主要的支持特征在本節(jié)中列出。. 特性包為Java Card平臺所寫的軟件遵循Java平臺包的標(biāo)準(zhǔn)規(guī)則。Java Card API類被寫成Java源文件,這些源文件包括包的指定。包機(jī)制用于識別和控制對類,靜態(tài)域和靜態(tài)方法的訪問。除了在“Java包訪問控制”中聲明的(節(jié)不支持的特性),在Java
36、Card平臺中的包一如其在Java平臺的使用方式。動態(tài)對象創(chuàng)建Java Card平臺的程序支持動態(tài)創(chuàng)建對象,包括類的實例和數(shù)組。其實現(xiàn)方式,和通常方式一樣,使用new操作符。對象被從堆中分配。Java Card虛擬機(jī)不必有垃圾收集對象。任何被虛擬機(jī)分配的對象可能即便其不再被使用,仍繼續(xù)存在并消耗資源。關(guān)于支持可選對象刪除機(jī)制的更多信息參見節(jié)對象刪除機(jī)制。虛方法因為基于Java Card卡技術(shù)的對象(“Java Card對象”)是Java編程語言對象,在為Java Card平臺所寫的程序中調(diào)用對象的虛方法與在為Java平臺所寫的程序中調(diào)用是完全一樣的。繼承是被支持的,包括super
37、關(guān)鍵字的使用。接口Java Card API類可以按照J(rèn)ava編程語言來定義和實現(xiàn)接口。在接口類調(diào)用方法的工作方式和預(yù)想的一樣。類型檢查和instanceof操作符也可與接口正常工作。異常Java Card程序可以如Java程序一樣來定義、拋出和捕獲異常。類Throwable和它相關(guān)的子類被支持。一些Exception和Error的子類被忽略,因為這些異常不會在Java Card平臺上發(fā)生。關(guān)于錯誤和異常的定義詳見節(jié)2.3.3異常。. 關(guān)鍵字下列關(guān)鍵字被支持。其用法同于Java編程語言一樣。表 2:被支持的關(guān)鍵字abstractdefaultifprivatethisboolea
38、ndoimplementsprotectedthrowbreakelseimportpublicthrowsbyteextendsinstanceofreturntrycasefinalintshortvoidcatchfinallyinterfacestaticwhileclassfornewsupercontinuegotopackageswitch. 類型Java編程語言類型boolean、byte、short和int被支持。對象(類實例和一維數(shù)組)也被支持。數(shù)組可以包含所支持的基本數(shù)據(jù)類型、對象和其它數(shù)組。一些Java Card實現(xiàn)可能不支持int數(shù)據(jù)類型的使用。(參考節(jié)
39、整數(shù)數(shù)據(jù)類型)。. 類java.lang包中的多數(shù)類在Java Card平臺上不被支持。以下來自java.lang的類以有限的方式在Card上被支持。Object如同在java編程語言中,Java Card API類繼承于java.lang.object,Object的多數(shù)方法在Java Card API中不可獲得,但是類自身存在是為了給類的層次結(jié)構(gòu)提供一個根。Throwable類Throwable和它的子類都被支持。Throwable的多數(shù)方法在Java Card API中不可獲得,但是類本身存在是為了給所有的異常提供一個共有的祖先。2.2.3. 可選支持項該節(jié)描
40、述Java Card平臺的可選特征??蛇x特征在Java Card平臺兼容的實現(xiàn)中不要求被支持。然而,如果實現(xiàn)包括了對一個可選的特征的支持,那么它必須被完全支持,并且就如同本文檔中所定義的。. 整數(shù)數(shù)據(jù)類型關(guān)鍵字int和32位integer數(shù)據(jù)類型在Java Card實現(xiàn)中不必被支持。不支持int數(shù)據(jù)類型的Java Card虛擬機(jī)將拒絕使用int數(shù)據(jù)類型或32位立即數(shù)的程序。無論輸入值是什么,算術(shù)表達(dá)式在Java Card虛擬機(jī)上產(chǎn)生的結(jié)果必須與在Java虛擬機(jī)上產(chǎn)生的相同。不能支持int數(shù)據(jù)類型的Java Card虛擬機(jī)必須拒絕那些可能產(chǎn)生不同結(jié)果的表達(dá)式。. 對象
41、刪除機(jī)制Java Card技術(shù),版本2.2.1提供一個可選的,對象刪除機(jī)制。被設(shè)計運(yùn)行在這些實現(xiàn)上的應(yīng)用可以通過調(diào)用合適的API來使用這些機(jī)制,參見Java Card平臺應(yīng)用編程接口2.2.1。但是,這一機(jī)制僅適合對證書、密鑰等大對象作原子修改。所以應(yīng)用編程者應(yīng)該在對象分配上比較審慎。2.2.4. Java卡虛擬機(jī)的限制資源有限硬件的限制性阻止Java Card虛擬機(jī)支持某Java平臺的特征的全部功能。盡管討論中的特征(可選特征,如:int支持)將被支持,但是特定虛擬機(jī)可能限制操作的范圍還是小于Java平臺的。(The features in question are supported, b
42、ut a particular virtual machine may limit the range of operation to less than that of the Java platform.)為了確保應(yīng)用代碼的可移植性,本節(jié)為對這些語言特征的部分支持,建立了最小需求級別。這里所列出的制約從應(yīng)用編程者的角度來看是最大值。沒有超出這些最大值的Java包可以被轉(zhuǎn)換為基于Java Card技術(shù)的CAP文件(“Java Card CAP文件”),并且可以被移植到所有的Java Card實現(xiàn)上。從Java Card虛擬機(jī)實現(xiàn)者的角度,這里列出的每一個最大值表明使應(yīng)用可移植的支持的最小級別
43、。. 包包引用一個包可以最多可以引用128個包。包名包的全名可以包括最多255個字符。如果包括一個或多個表達(dá)成多字節(jié)UTF-8格式的字符,包名的大小還需要進(jìn)一步被限制。. 類包中的類一個包可以包含最多255個類和接口。接口一個類可以實現(xiàn)最多15個接口,包括被超類實現(xiàn)的接口。一個接口可以從最多14個超接口繼承。靜態(tài)域在applet包中的一個類可以有最多256個public或protected的靜態(tài)非final域。類庫包中的一個類可以有最多255個public或protected的靜態(tài)nonfinal域。對于在類中聲明的靜態(tài)final域(常量)的個數(shù)沒有限制。靜態(tài)方法在
44、applet包中的一個類可以有最多256個public或protected的靜態(tài)方法。類庫包中的一個類可以有最多255個public或protected的靜態(tài)方法。. 對象方法一個類可以實現(xiàn)最大128個public或protected的實例方法,以及最大128個有包可視屬性的實例方法。這些限制包括繼承的方法。類實例類實例可以包含最多255個域,其中int數(shù)據(jù)類型被按照占用兩個域來計算。這個限制包括繼承域。數(shù)組數(shù)組可以包含最大32767個域。. 方法在一個方法中最多使用的變量個數(shù)為255。這個限制包括局部變量、方法參數(shù)和在實例方法調(diào)用中,指向被調(diào)用方法對象的引用(也就
45、是this)。int數(shù)據(jù)類型被當(dāng)作占用兩個局部變量來計。一個方法可以有最多32767個Java Card虛擬機(jī)字節(jié)碼?;贘ava Card技術(shù)的字節(jié)碼個數(shù)可能不同于那個方法的實現(xiàn)在Java虛擬機(jī)中Java字節(jié)碼的個數(shù)。與一個方法相關(guān)的操作棧的最大深度是255個16位單元。. Switch StatementsJava Card虛擬機(jī)的switch指令的格式限制是switch語句的case最大值為65536。這個限制遠(yuǎn)大于對方法最大長度的限制(節(jié)方法)。. 類初始化因為沒有執(zhí)行<clinit>方法的基本機(jī)制,Java Card虛擬機(jī)包含對類
46、初始化的有限支持。對<clinit>方法的支持限于附加了以下制約條件的靜態(tài)域值的初始化。l applet包的靜態(tài)域只可以被初始化成基本的編譯時常量值,或基本的編譯時常量的數(shù)組。l 用戶庫中的靜態(tài)域只可以被初始化成編譯時的基本常量值。l 只有在當(dāng)前類中聲明的靜態(tài)域可以在<clinit>方法中被初始化基本的常量數(shù)據(jù)類型包括boolean、byte、short和int。在靜態(tài)域初始化上遵守這些的語言約束的給定的Java源文件,期望Java編譯器應(yīng)該:l 將常數(shù)內(nèi)聯(lián)到字節(jié)碼中,該字節(jié)碼引用了在聲明語句中被初始化的靜態(tài)final基本域。l 只產(chǎn)生以下字節(jié)碼:n 將值裝載入棧:ic
47、onst_m1,0-5,b|sipush,ldc,ldc_w,aconst_nulln 創(chuàng)建一個數(shù)組:newarray(byte|short|boolean|int)n 在棧里復(fù)制數(shù)據(jù)項:dupn 將值存儲到數(shù)組或靜態(tài)域:b|i|sastore,putstaticn 從方法返回:return2.2.5. 多選擇Applet限制實現(xiàn)javacard.framework.Multiselectable接口的applet被稱為多選applet。有關(guān)多選的更多細(xì)節(jié),請參見Java Card平臺運(yùn)行時環(huán)境規(guī)范2.2.1。一個包中所有applet要么都是多選的,要么皆非多選。2.2.6. Java卡遠(yuǎn)程方
48、法調(diào)用限制本節(jié)定義了被Java Card平臺RMI(“Java Card RMI”)所支持的RMI系統(tǒng)子集。. 遠(yuǎn)程類和遠(yuǎn)程接口一個類或者它的超類實現(xiàn)了遠(yuǎn)程接口,則這個類是遠(yuǎn)程類。遠(yuǎn)程接口是滿足以下要求的接口:l 接口名是java.rmi.Remote或從java.rmi.Remote直接或間接擴(kuò)展的接口l 遠(yuǎn)程接口或其超類接口中的每一個方法的聲明都在其throws語句中包含異常java.rmi.RemoteException(或它的超類之一)l 在遠(yuǎn)程方法聲明中,如果遠(yuǎn)程對象被聲明為一個返回類型,那么它應(yīng)被聲明為遠(yuǎn)程接口,而不是該接口的實現(xiàn)類。此外,Java Card RMI在
49、定義遠(yuǎn)程方法時,引入額外的約束條件。這些約束是Java Card平臺語言子集和其他特征約束的結(jié)果。更多信息,參見節(jié)遠(yuǎn)程接口的訪問控制和節(jié)參數(shù)和返回值。. 遠(yuǎn)程接口的訪問控制Java RMI系統(tǒng)支持用Java語言中定義的包訪問控制。但是,Java Card RMI不支持包可視遠(yuǎn)程接口。. 參數(shù)和返回值遠(yuǎn)程方法必須僅包含以下類型的參數(shù):l 任何被Java Card技術(shù)支持的基本類型(boolean,byte,short,int);l 任何被Java Card技術(shù)支持的基本類型的一維數(shù)組(boolean, byte,short,int);遠(yuǎn)程方
50、法的返回類型必須僅包含以下類型之一:l 任何被Java Card技術(shù)支持的基本類型(boolean,byte,short,int);l 任何被Java Card技術(shù)支持的基本類型的一維數(shù)組(boolean, byte,short,int);l 任何遠(yuǎn)程接口類型l void類型2.3. Java卡虛擬機(jī)子集Java Card技術(shù)使用Java虛擬機(jī)的子集,理解Java Card虛擬機(jī)要求熟悉Java虛擬機(jī)。本節(jié)中討論的內(nèi)容不是在虛擬機(jī)規(guī)范的水平上進(jìn)行描述的。有關(guān)Java虛擬機(jī)的完整文檔,請參見Java 虛擬機(jī)規(guī)范。2.3.1. class文件子集Java Card虛擬機(jī)的操作可以以標(biāo)準(zhǔn)Java平臺
51、class文件來定義。既然Java Card虛擬機(jī)僅支持Java虛擬機(jī)行為的一個子集,它也僅支持標(biāo)準(zhǔn)class文件格式的一個子集。. class文件中不支持項域描述符域描述符可能不包括BaseType字符C,D,F(xiàn)或J 有關(guān)基本類型:BaseType CharacterTypeBaseType CharacterTypeBbyteCcharIintDdoubleSshortFfloatZbooleanJlong。多于一維的數(shù)組定義的ArrayType描述符不能使用。常量池有以下tag值的常量池表條目不被支持表 3:不支持的Java 常量池tag常量類型值CONSTANT_Stri
52、ng8CONSTANT_Float4CONSTANT_Long5CONSTANT_Double6域在field_info結(jié)構(gòu)中,訪問標(biāo)記ACC_VOLATILE和ACC_TRANSIENT不被支持。方法在method_info結(jié)構(gòu)中,訪問標(biāo)記ACC_SYNCHRONIZED,ACC_STRICT,和ACC_NATIVE不被支持。. class文件中支持項ClassFileClassFile結(jié)構(gòu)中的所有項都被支持域描述符域描述符可能包含BaseType字符B,I,S,和Z1,以及任何ObjectType。一維數(shù)組的ArrayType描述符也可以使用。方法描述符支持所有格式的方法描述
53、符。常量池支持tag值為以下各項的常量池條目。表 4:支持的Java 常量池tag常量類型值CONSTANT_Class7CONSTANT_Fieldref9CONSTANT_Methodref10CONSTANT_InterfaceMethodref11CONSTANT_Integer3CONSTANT_NameAndType12CONSTANT_Utf81域在field_info結(jié)構(gòu)中,支持的訪問標(biāo)記有ACC_PUBLIC,ACC_PRIVATE,ACC_PROTECTED,ACC_STATIC和ACC_FINAL。field_info結(jié)構(gòu)中的其余組件將被完全支持。方法在method_in
54、fo結(jié)構(gòu)中,支持的訪問標(biāo)記有ACC_PUBLIC,ACC_PRIVATE,ACC_PROTECTED,ACC_STATIC,ACC_FINAL和ACC_ABSTRACT。method_info中的其余組件將完全被支持。屬性attribute_info結(jié)構(gòu)被支持。Code,ConstantValue,Exceptions,LocalVariableTable,Synthetic,InnerClasses和Deprecated屬性被支持。2.3.2. 字節(jié)碼子集以下章節(jié)給出了Java Card平臺支持或不支持的字節(jié)碼的詳細(xì)信息。更多細(xì)節(jié),參見7 Java卡虛擬機(jī)指令集。. 不支持的字節(jié)碼表 5:不支持的字節(jié)碼lconst_<l> fconst_<f> dconst_<d>ldc2_w2lload fload dload lload_<n>fload_<n> dload_<n> laload
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金屬板材產(chǎn)品購銷合同(3篇)
- 地產(chǎn)規(guī)劃合同范本
- epc總包合同范本
- 入小股合同范本
- 大宗購物合同范本
- 活體銷售合同范本
- 長寧個人廠房出租合同范本
- 《核電工程綠色施工評價規(guī)程》
- 管線探測合同范本
- 潤滑設(shè)備合同范本
- 如何引導(dǎo)孩子明確自己的興趣與愛好
- 脊髓電刺激促醒“植物人”
- 四年級科學(xué)上冊(蘇教版)第12課點亮小燈泡(教學(xué)設(shè)計)
- 人教版《道德與法治》七年級上冊做更好的自己課件
- 2024年《鐵路勞動安全》考試復(fù)習(xí)題庫(含答案)
- 2024年內(nèi)科護(hù)理學(xué)(第七版)期末考試復(fù)習(xí)題庫(含答案)
- 腦出血之基底節(jié)出血查房護(hù)理課件
- 安全:不亂吃東西
- 客觀事物的復(fù)雜性課件
- 下肢深靜脈血栓的護(hù)理課件
- 山西省醫(yī)療服務(wù)項目收費
評論
0/150
提交評論