Java浜岃繘鍒舵寚浠や唬鐮佷互浠ヤ笅鏍煎紡绱у噾鎺掑垪錛?/span>opcode鍗犱竴涓瓧鑺傦級錛?/span>
opcode operand*
闄や簡tableswitch鍜?/span>lookupswitch涓ゆ潯鎸囦護涓棿瀛樺湪濉厖瀛楄妭浠ュ錛屽叾浠栨寚浠ら兘娌℃湁濉厖瀛楄妭錛屽嵆浣垮湪涓ゆ潯鎸囦護涔嬮棿涔熸病鏈夈傚洜鑰屽湪璇誨彇鎸囦護鐨勬椂鍊欙紝瑕佹牴鎹寚浠ょ殑瀹氫箟璇誨彇銆?/span>
閫氳繃瀵逛笂闈?/span>Java鎸囦護闆嗙殑鍒嗘瀽鍙互鐭ラ亾錛?/span>Java鎸囦護闆嗕腑寰堝ぇ涓閮ㄥ垎娌℃湁鎿嶄綔鏁幫紝鍥犺屽榪欓儴鍒嗘寚浠わ紝鍙渶瑕佽鍙栦竴涓瓧鑺傜殑鎿嶄綔鐮侊紝灝嗘搷浣滅爜鏄犲皠鎴愬姪璁扮鍗沖彲銆?/span>
鑰屽鍏朵粬甯︽搷浣滄暟鐨勬寚浠わ紝鍒欓渶瑕佹牴鎹笉鍚岀被鍨嬪垎鏋愶紙鐢變簬apache涓殑bcel錛?/span>Binary Code Engineering Library錛夊瀛楄妭鐮佺殑鏀寔錛屾搷浣滅爜鍜屽姪璁扮鐨勬槧灝勫彲浠ョ敤com.sun.org.apache.bcel.internal.Constats涓彁渚涚殑鏄犲皠琛ㄦ暟緇勬潵瀹屾垚錛夈?/span>
1. 澶勭悊涓ゆ潯鐗規畩鐨勬寚浠?/span>tableswitch鍜?/span>lookupswitch鎸囦護銆?/span>
瀵硅繖涓ゆ潯鎸囦護錛岄鍏堥兘瑕佸幓鎺夊~鍏呭瓧絎︿互浣?/span>defaultbyte1绱㈠紩鍙鋒槸瀛楀榻愮殑銆?/span>
private static void make4ByteAlignment(ByteSequence codes) {
int usedBytes = codes.getIndex() % 4;
int paddingBytes = (usedBytes == 0) ? 0 : 4 - usedBytes;
for(int i = 0;i < paddingBytes;i++) {
codes.readByte();
}
}
瀵?/span>tableswitch鎸囦護錛岃鍙?/span>defaultoffset鍊鹼紝鏈灝忛」鐨勫鹼紝鏈澶ч」鐨勫間互鍙婂湪鏈灝忛」鍜屾渶澶ч」涔嬮棿姣忎竴欏圭殑offset鍊箋傚茍涓斿皢璇誨彇鍒扮殑offset鍊煎拰褰撳墠鎸囦護鐨勫熀鍦板潃鐩稿姞錛?/span>
int defaultOffset1 = baseOffset + codes.readInt();
builder.append("\tdefault = #" + defaultOffset1);
int low = codes.readInt();
int high = codes.readInt();
int npair1 = high - low + 1;
builder.append(", npairs = " + npair1 + "\n");
for(int i = low;i <= high;i++) {
int match = i;
offset = baseOffset + codes.readInt();
builder.append(String.format("\tcase %d : #%d\n", match, offset));
}
瀵?/span>lookupswitch鎸囦護錛岃鍙?/span>defaultoffset鍊鹼紝閿煎鏁板鹼紙npairs錛夛紝浠ュ強npairs瀵圭殑閿煎錛屽皢寰楀埌鐨?/span>offset鍊煎拰褰撳墠鎸囦護鐨勫熀鍦板潃鐩稿姞錛?/span>
int defaultOffset2 = baseOffset + codes.readInt();
builder.append("\tdefault = #" + defaultOffset2);
int npairs2 = codes.readInt();
builder.append(", npairs = " + npairs2 + "\n");
for(int i = 0;i < npairs2;i++) {
int match = codes.readInt();
offset = baseOffset + codes.readInt();
builder.append(String.format("\tcase %d : #%d\n", match, offset));
}
2. 鎵鏈夋潯浠惰煩杞寚浠ら兘鏈変袱涓瓧鑺傜殑鍋忕Щ閲忔搷浣滄暟錛?/span>if<cond>, if_icmp<cond>, ifnull, ifnonnull, if_acmp<cond>錛夈傛棤鏉′歡璺寵漿鎸囦護goto鍜屽瓙渚嬬▼璺寵漿鎸囦護jsr涔熼兘鏄袱涓瓧鑺傜殑鍋忕Щ閲忎綔涓烘搷浣滄暟銆?/span>
offset = baseOffset + codes.readShort();
builder.append(String.format("\t\t#%d\n", offset));
3. 瀵瑰鍋忕Щ閲忕殑璺寵漿鎸囦護goto_w鍜屽瓙渚嬬▼璺寵漿鎸囦護jsr_w鐨勬搷浣滄暟鏄洓涓瓧鑺傜殑鍋忕Щ閲忋?/span>
offset = baseOffset + codes.readInt();
builder.append(String.format("\t\t#%d\n", offset));
4. wide鎸囦護錛屽垯緇х畫璇誨彇涓嬩竴鏉℃寚浠わ紝騫跺皢wide鍙傛暟璁劇疆涓?/span>true銆?/span>
byteCodeToString(codes, pool, verbose, true);
5. 榪樻湁涓浜涙寚浠ゅ間互涓涓瓧鑺傜殑灞閮ㄥ彉閲忕儲寮曞彿浣滀負鎿嶄綔鏁扮殑錛屽鏋滄湁wide淇グ錛屽垯鐢ㄤ袱涓瓧鑺備綔涓烘搷浣滄暟錛屼唬琛ㄥ眬閮ㄥ彉閲忕儲寮曞彿銆傝繖鏍風殑鎸囦護鏈夛細aload, iload, fload, lload, dload, astore, istore, fstore, lstore, dstore, ret銆?/span>
if(wide) {
index = codes.readUnsignedShort();
} else {
index = codes.readUnsignedByte();
}
builder.append(String.format("\t\t%%%d\n", index));
6. iinc鎸囦護錛屼互涓涓瓧鑺傜殑灞閮ㄥ彉閲忕儲寮曞彿鍜屼竴涓嚜宸辯殑甯擱噺浣滀負鍙傛暟錛涘鏋滀互wide淇グ錛屽垯璇ユ寚浠ょ殑灞閮ㄥ彉閲忕儲寮曞彿鍜屽父閲忛兘鍗犱袱涓瓧鑺傘?/span>
if(wide) {
index = codes.readUnsignedShort();
constValue = codes.readShort();
} else {
index = codes.readUnsignedByte();
constValue = codes.readByte();
}
builder.append(String.format("\t\t%d %d\n", index, constValue));
7. 瀵硅薄鎿嶄綔鎸囦護錛屽畠浠殑鎿嶄綔鏁伴兘鏄父閲忔睜涓殑绱㈠紩錛岄暱搴︿負涓や釜瀛楄妭銆傛寚鍚?/span>CONSTANT_Class_info綾誨瀷鐨勭粨鏋勶紝榪欎簺鎸囦護鏈?/span>new, checkcast, instanceof, anewarray銆?/span>
index = codes.readUnsignedShort();
builder.append("\t\t" + pool.getClassInfo(index).toInstructionString(verbose) + "\n");
8. 鎵鏈夊瓧孌墊搷浣滄寚浠わ紝瀹冧滑鐨勬搷浣滄暟閮芥槸甯擱噺姹犱腑鐨勭儲寮曪紝闀垮害涓轟袱涓瓧鑺傘傛寚鍚?/span>CONSTANT_Fieldref_info綾誨瀷緇撴瀯錛岃繖浜涙寚浠ゆ湁getfield, putfield, getstatic, putstatic銆?/span>
index = codes.readUnsignedShort();
builder.append("\t\t" + pool.getFieldRefInfo(index).toInstructionString(verbose) + "\n");
9. 闈炴帴鍙f柟娉曡皟鐢ㄦ寚浠わ紝涔熼兘鏄互涓や釜瀛楄妭鐨勭儲寮曞彿浣滀負鎿嶄綔鏁幫紝鎸囧悜甯擱噺姹犱腑鐨?/span>CONSTANT_Methodref_info綾誨瀷緇撴瀯錛岃繖浜涙寚浠ゆ湁invokespecial, invokevirtual, invokestatic銆?/span>
index = codes.readUnsignedShort();
builder.append("\t\t" + pool.getMethodRefInfo(index).toInstructionString(verbose) + "\n");
10. 鎺ュ彛鏂規硶璋冪敤鎸囦護invokeinterface錛屽畠鏈夊洓涓瓧鑺傜殑鎿嶄綔鏁幫紝鍓嶄袱涓瓧鑺備負甯擱噺姹犵殑绱㈠紩鍙鳳紝鎸囧悜CONSTANT_InterfaceMethodref_info綾誨瀷錛岀涓変釜瀛楄妭涓?/span>count錛岃〃紺哄弬鏁扮殑瀛楄妭鏁幫紝鏈鍚庝竴涓瓧鑺備負0鍊箋?/span>
index = codes.readUnsignedShort();
int nargs = codes.readUnsignedByte(); //Historical, redundant
builder.append("\t\t" + pool.getInterfaceMethodRefInfo(index).toInstructionString(verbose));
builder.append(" : " + nargs + "\n");
codes.readUnsignedByte(); //reserved should be zero
11. 鍩烘湰綾誨瀷鐨勬暟緇勫垱寤烘寚浠?/span>newarray錛屽畠鐨勬搷浣滄暟涓轟竴涓瓧鑺傜殑綾誨瀷鏍囪瘑銆?/span>
String type = Constants.TYPE_NAMES[codes.readByte()];
builder.append(String.format("\t\t(%s)\n", type));
12. 澶氱淮鏁扮粍鐨勫垱寤烘寚浠?/span>multianewarray錛屽畠鏈変笁涓瓧鑺傜殑鎿嶄綔鏁幫紝鍓嶄袱涓瓧鑺備負绱㈠紩鍙鳳紝鎸囧悜CONSTANT_Class_info綾誨瀷錛岃〃紺烘暟緇勭殑綾誨瀷錛屾渶鍚庝竴涓瓧鑺傛寚瀹氭暟緇勭殑緇村害銆?/span>
index = codes.readUnsignedShort();
int dimensions = codes.readUnsignedByte();
builder.append(String.format("\t\t%s (%d)\n", pool.getClassInfo(index).getName(), dimensions));
13. 甯擱噺鍏ユ爤鎸囦護ldc錛屼互涓涓瓧鑺傜殑绱㈠紩鍙蜂綔涓哄弬鏁幫紝鎸囧悜CONSTANT_Integer_info銆?/span>CONSTANT_Float_info銆?/span>CONSTANT_String_info銆?/span>CONSTANT_Class_info綾誨瀷錛岃〃紺鴻鍏ユ爤鐨勫父閲忓鹼紙int綾誨瀷鍊箋?/span>float綾誨瀷鍊箋?/span>String寮曠敤綾誨瀷鍊兼垨瀵硅薄寮曠敤綾誨瀷鍊鹼級銆?/span>
index = codes.readUnsignedByte();
builder.append("\t\t" + pool.getPoolItem(index).toInstructionString(verbose) + "\n");
14. 瀹界儲寮曠殑甯擱噺鍏ユ爤鎸囦護ldc_w錛屼互涓や釜瀛楄妭鐨勭儲寮曞彿浣滀負鍙傛暟錛屾寚鍚?/span>CONSTANT_Integer_info銆?/span>CONSTANT_Float_info銆?/span>CONSTANT_String_info銆?/span>CONSTANT_Class_info綾誨瀷錛岃〃紺鴻鍏ユ爤鐨勫父閲忓鹼紙int綾誨瀷鍊箋?/span>float綾誨瀷鍊箋?/span>String寮曠敤綾誨瀷鍊兼垨瀵硅薄寮曠敤綾誨瀷鍊鹼級銆?/span>
index = codes.readUnsignedShort();
builder.append("\t\t" + pool.getPoolItem(index).toInstructionString(verbose) + "\n");
15. 瀹界儲寮曠殑甯擱噺鍏ユ爤鎸囦護ldc2_w錛屼互涓や釜瀛楄妭鐨勭儲寮曞彿浣滀負鍙傛暟錛屾寚鍚?/span>CONSTANT_Long_info銆?/span>CONSTANT_Double_info綾誨瀷錛岃〃紺鴻鍏ユ爤鐨勫父閲忓鹼紙long綾誨瀷鍊箋?/span>double綾誨瀷鍊鹼級銆?/span>
index = codes.readUnsignedShort();
builder.append("\t\t" + pool.getPoolItem(index).toInstructionString(verbose) + "\n");
16. bipush鎸囦護錛屼互涓涓瓧鑺傜殑甯擱噺浣滀負鎿嶄綔鏁般?/span>
byte constByte = codes.readByte();
builder.append(“\t” + constByte);
17. sipush鎸囦護錛屼互涓や釜瀛楄妭鐨勫父閲忎綔涓烘搷浣滄暟銆?/span>
short constShort = codes.readShort();
builder.append(“\t” + constShort);
浠ヤ笂榪樻湁涓浜涙病鏈夊畬鎴愮殑浠g爜錛屽寘鎷瓧孌碉紙鏂規硶錛夌殑絳懼悕鍜屾弿榪扮娌℃湁瑙f瀽錛屾湁涓浜涜В鏋愮殑鏍煎紡榪橀渶瑕佽皟鏁寸瓑銆備笉綆℃庝箞鏍鳳紝鎬諱綋鐨勭粨鏋勫氨鏄繖鏍蜂簡錛屽叾瀹冪殑閮芥槸緇嗚妭闂錛岃繖閲屼笉璁ㄨ浜嗐?/span>
鍙傝bcel欏圭洰鐨?/span>org.apache.bcel.classfile.Utility綾?
2010騫?0鏈?鏃?/span>
Java铏氭嫙鏈轟綋鍐呴儴緋葷粨鏋勫寘鎷?/span>class鏂囦歡銆佺被瑁呰澆瀛愮郴緇熴佽繍琛屾椂鏁版嵁鍖恒佷箣琛屽紩鎿庛佹湰鍦版柟娉曡皟鐢ㄧ粨鏋勶紝鍏朵腑榪愯鏃舵暟鎹尯鍖呮嫭鏂規硶鍖恒佸爢銆?/span>Java鏍堛佺▼搴忚鏁板櫒銆佹湰鍦版柟娉曟爤絳夈傚叿浣撶粨鏋勫涓嬪浘鎵紺猴紙鎽樿嚜Inside Java Virtual Machine錛夛細
1. class鏂囦歡
鍦?/span>Java涓紝鎵鏈夋簮鏂囦歡閮界紪璇戞垚浜岃繘鍒剁殑瀛楄妭鐮侊紝鐒跺悗鐢辮櫄鎷熸満瑁呰澆榪愯銆備竴鑸繖鏍風殑瀛楄妭鐮佹槸浠?/span>class鏂囦歡鐨勫艦寮忓瓨鍦ㄣ傚湪榪愯鏃訛紝鐢?/span>ClassLoader綾伙紙System ClassLoader or User-defined ClassLoader錛夋壘鍒板搴旂殑class鏂囦歡錛岃鍙栧叾涓殑瀛楄妭鐮侊紝鐒跺悗浜ょ敱铏氭嫙鏈鴻В鏋愯繍琛屻?/span>
鍦?/span>class鏂囦歡涓紝鍖呭惈浜嗗畾涔変竴涓被鎴栨帴鍙g殑鎵鏈変俊鎭紝鍖呮嫭綾誨悕銆佽闂潈闄愩佺埗綾誨悕銆佺戶鎵跨殑鎵鏈夋帴鍙c佹墍鏈夊瓧孌點佹墍鏈夋柟娉曘佹柟娉曚腑鐨勪唬鐮併佸睘鎬х瓑淇℃伅錛屽茍涓旀瘡涓?/span>class鏂囦歡鐨勫紑澶磋繕鍖呭惈浜嗛瓟鏈煎拰鐗堟湰淇℃伅錛岄瓟鏈肩敤浠ユ爣璇嗗綋鍓嶇殑瀛楄妭鐮佹槸鍚堟硶鐨勫瓧鑺傜爜錛岀増鏈〃紺虹敓鎴愬綋鍓嶅瓧鑺傜爜鐨勭紪璇戝櫒鐗堟湰錛屼粠鑰岃櫄鎷熸満鑾風煡鍏剁増鏈屽仛鐗瑰畾澶勭悊錛屽鏋滃浜庤櫄鎷熸満涓嶆敮鎸佺殑瀛楄妭鐮佺増鏈彿鎷掔粷鍔犺澆銆?/span>
鍦?/span>class鏂囦歡涓紝寰堝淇℃伅閮芥槸浠ュ瓧絎︿覆鐨勫艦寮忓瓨鏀撅紝姣斿瀵瑰閮ㄧ被鎴愬憳鎴栨柟娉曠殑寮曠敤錛岃繖浜涘瓧絎︿覆淇℃伅鍦ㄩ摼鎺ョ殑鏃跺欑敱铏氭嫙鏈鴻В鏋愩傛瘡涓?/span>Java綾伙紝涓嶇鏄寘鎴愬憳綾昏繕鏄唴閮ㄧ被閮戒細鐢熸垚涓涓崟鐙殑class鏂囦歡錛屽洜鑰?/span>class鏂囦歡鏄浉瀵圭嫭绔嬬殑銆傝緇嗕俊鎭弬鑰?/span>class鏂囦歡鏍煎紡銆?/span>
2. 綾昏杞藉瓙緋葷粺
綾昏杞藉瓙緋葷粺璐熻矗鏌ユ壘class鏂囦歡錛岃鍙栧瓧鑺傜爜錛屽仛閮ㄥ垎綆鍗曠殑媯楠岋紝濡傞瓟鏁版槸鍚︽紜紝鐗堟湰鏄惁鍙楁敮鎸侊紝鍚勭鏁版嵁鏍煎紡鏄惁姝g‘絳夈傞儴鍒嗚В鏋愬悗鐨勫瓧鑺傜爜鏁版嵁瀛樻斁鍒版柟娉曞尯涓紝鏈鍚庡垱寤哄瓧鑺傜爜浠h〃鐨勭被鎴栨帴鍙g殑Class瀹炰緥銆?/span>
鍦?/span>Java涓紝綾昏杞界郴緇熸槸閫氳繃ClassLoader鏉ュ畬鎴愮殑銆傝櫄鎷熸満瑙勮寖涓紝瀹氫箟浜嗗惎鍔ㄧ被瑁呰澆鍣ㄥ拰鐢ㄤ簬瀹氫箟綾昏杞藉櫒銆傚湪sun鎻愪緵鐨勮櫄鎷熸満涓紝鍖呮嫭浜嗗惎鍔ㄧ被瑁呰澆鍣ㄣ佹墿灞曠被瑁呰澆鍣ㄣ佺郴緇熺被瑁呰澆鍣ㄣ佺敤鎴峰畾涔夌被瑁呰澆鍣ㄣ備粬浠互鐖跺瓙閾劇殑鏂瑰紡緇勭粐鍦ㄤ竴璧楓傞櫎浜嗗惎鍔ㄧ被瑁呰澆鍣紝鍏朵粬鐨勮杞藉櫒閮芥槸ClassLoader鐨勫瓙綾匯?/span>ClassLoader瀹氫箟浜嗕竴浜涙柟娉曞彲浠ュ府鍔╃敤鎴峰畾涔夎嚜宸辯殑綾昏杞藉櫒錛屽defineClass絳夈傝鎯呭弬鑰?/span>Java涓殑ClassLoader銆?/span>
濡備綍鍗歌澆綾繪暟鎹紵錛堢涓冪珷錛?/span>
3. 榪愯鏃舵暟鎹尯
榪愯鏃舵暟鎹尯淇濆瓨浜嗘墍鏈夊湪榪愯鏃剁殑淇℃伅銆傚寘鎷柟娉曞尯銆?/span>Java鏍堛佸爢銆佺▼搴忓瘎瀛樺櫒銆佹湰鍦版柟娉曟爤絳夈傚叾涓柟娉曞尯鍜屽爢鍙湪铏氭嫙鏈轟腑淇濆瓨涓浠藉疄渚嬶紝鍥犺岄渶瑕佸鐞嗗綰跨▼鐨勫悓姝ラ棶棰橈紱Java鏍堛佺▼搴忓瘎瀛樺櫒鏄瘡涓嚎紼嬩腑鏈夊崟鐙殑瀹炰緥錛屽洜鑰屽涓嶅悓鐨勭嚎紼嬶紝浠栦滑鐨勬暟鎹槸縐佹湁鐨勩?/span>
3.1 鏂規硶鍖?/span>
鏂規硶鍖轟腑淇濆瓨浜嗚鍙栫殑瀛楄妭鐮佷俊鎭紙鍖呮嫭甯擱噺姹狅紝闈欐佹柟娉曞拰闈欐佹垚鍛樹俊鎭級銆佸瓧鑺傜爜浠h〃鐨?/span>Class綾誨疄渚嬨佷竴涓寚鍚戝姞杞藉畠鐨?/span>ClassLoader瀹炰緥銆?/span>
Java紼嬪簭鍙互鏈変袱縐嶆柟寮忔潵鑾峰彇鏌愪釜綾葷殑Class瀹炰緥錛?/span>
1. Class.forName()鏂規硶
2. Object.getClass()鏂規硶
閫氳繃Class瀹炰緥鑾峰彇鍜岃綾繪垨鎺ュ彛鐩稿叧鐨勪換浣曚俊鎭傚弬鑰?/span>Class綾葷殑瀹氫箟銆?/span>
錛堟敞錛氬鏈夊惎鍔?/span>ClassLoader鍔犺澆鐨勭被錛?/span>Class鏂規硶涓殑getClassLoader鏂規硶榪斿洖null錛?/span>
涓哄姞蹇墽琛岄熷害錛屽彲浠ュ湪鏂規硶鍖轟腑寮曞叆鏂規硶琛ㄦ満鍒訛紝璁板綍鑳借澶栫晫璋冪敤鐨勮綾葷殑瀹炰緥鏂規硶錛屽寘鎷埗綾諱腑緇ф壙涓嬫潵鐨勬柟娉曘?strong>錛堢鍏珷璇︾粏浠嬬粛錛燂級
鏂規硶鍖轟腑鏍規嵁綾誨悕鎼滅儲綾諱俊鎭紝綆楁硶錛氭暎鍒椼佹悳绱㈡爲絳夈?/span>
3.2 Java鏍?/span>
铏氭嫙鏈轟負姣忎釜綰跨▼鐢熸垚涓涓?/span>Java鏍堬紝鍥犺屽涓嶅悓鐨勭嚎紼嬶紝鏍堝唴鐨勬暟鎹兘鏄鏈夌殑銆?/span>Java鏍堢敱鏍堝撫緇勬垚錛?/span>Java鏍堢殑鎿嶄綔鍙湁涓ょ錛屽帇鍏ユ爤甯у拰寮瑰嚭鏍堝撫銆傜嚎紼嬩腑姣忎釜鏂規硶鐨勮皟鐢ㄩ兘浼氬湪Java鏍堝帇鍏ヤ竴涓爤甯э紱姣忔鏂規硶榪斿洖錛堟甯告柟娉曟垨鎶涘紓甯歌繑鍥烇級錛岃鏂規硶瀵瑰簲鐨勬爤甯ч兘浼氫粠鏍堜腑寮瑰嚭銆?/span>
3.2.1 鏍堝撫
鏍堝撫鐢辨搷浣滄暟鏍堛佸眬閮ㄥ彉閲忓尯鍜屾爤甯ф暟鎹粍鎴愩傜敱浜?/span>Java涓殑鎸囦護鏄熀浜庢爤鑰岃璁$殑錛屽洜鑰屽緢澶氭寚浠ょ殑榛樿鎿嶄綔鏁板氨鏄搷浣滄暟鏍堜腑鐨勬暟鎹傛搷浣滄暟鏍堢敤浜庝繚瀛樻寚浠ょ殑鎿嶄綔鏁板拰鎸囦護鎿嶄綔鍚庣殑緇撴灉銆?/span>
灞閮ㄥ彉閲忓尯鐢ㄤ簬淇濆瓨褰撳墠鏂規硶鐨勫眬閮ㄥ彉閲忋?/span>
鏍堝撫鏁版嵁鍖哄垯淇濆瓨褰撳墠鏍堝撫鐨勪俊鎭紝濡傛寚鍚戝綋鍓嶇被甯擱噺姹犵殑鎸囬拡錛岀敤浜庢搷浣滄暟涓哄父閲忔睜绱㈠紩鐨勬寚浠わ紱榪樻湁涓浜涘拰鐗瑰畾铏氭嫙鏈哄疄鐜扮浉鍏崇殑淇℃伅鍜岃皟璇曚俊鎭?/span>
3.3 紼嬪簭瀵勫瓨鍣?/span>
姣忎釜綰跨▼鍦ㄦ墽琛屾椂閮戒細淇濆瓨褰撳墠鎸囦護鐨勪笅涓鏉℃寚浠ょ殑鍦板潃錛屼互鎺у埗紼嬪簭鐨勪箣琛屾祦紼嬨?/span>
3.4 鍫?/span>
鍫嗕繚瀛樹簡紼嬪簭鍦ㄨ繍琛屾椂鐨勬墍鏈夊璞°傚湪Java涓紝鎵鏈夌殑瀵硅薄閮芥槸淇濆瓨鍦ㄥ爢涓殑錛岃屽閮ㄩ氳繃瀵硅薄鐨勫紩鐢ㄦ潵璁塊棶瀵硅薄銆傜敱浜?/span>Java瀛樺湪鍨冨溇鍥炴敹鍣紝鍥犺?/span>Java瀵硅薄鍙兘琚Щ鍔紝浠ュ噺灝戝唴瀛樼鐗囥傚叾涓竴縐嶅疄鐜板彲浠ュ緢濂界殑瑙e喅縐誨姩瀵硅薄鑰岄渶瑕佹敼鍙樻墍鏈夎瀵硅薄鐨勫紩鐢ㄥ彉閲忕殑鎶鏈紝鍗沖皢鍫嗗垎涓哄彞鏌勬睜鍜屽璞℃睜銆傚璞℃睜涓殑瀵硅薄淇濆瓨浜嗗璞$殑鐪熸鍐呭錛岃屽彞鏌勬睜涓殑欏瑰寘鍚袱涓寚閽堬紝涓涓寚鍚戝璞★紝涓涓寚鍚戠被鏁版嵁銆備竴涓璞″紩鐢ㄥ氨鏄寚鍚戝彞鏌勭殑涔嬫垬銆傝繖鏍峰綋闇瑕佺Щ鍔ㄥ璞℃椂錛屽彧瑕佹敼鍙樺彞鏌勬睜涓寚鍚戝璞$殑鎸囬拡鍊煎嵆鍙傜劧鑰岃繖縐嶈璁℃槸浠ョ壓鐗查熷害涓轟唬浠風殑錛屽洜涓鴻繖鏍鋒瘡嬈¤闂璞″氨瑕佸緇忓巻涓嬈℃寚閽堝畾浣嶃?/span>
鍦ㄦ煇浜涘瀮鍦懼洖鏀跺櫒瀹炵幇涓紝瀵硅薄闇瑕侀澶栫殑淇℃伅錛屽鏋滃紩鐢ㄨ鏁扮殑鍨冨溇鏀墮泦鍣紝闇瑕佷負姣忎釜瀵硅薄璁板綍寮曠敤璁℃暟淇℃伅錛涜屽鍙﹀鏈変簺鏈哄埗錛屽垯鍙兘闇瑕佹殏鏃朵繚瀛樻煇浜涙暟鎹傝繖浜涢澶栫殑鏁版嵁鍙互淇濆瓨鍦ㄧ被涓紝涔熷彲浠ュ湪璁板綍鍦ㄥ叾浠栧湴鏂廣傜被浼肩殑榪樻湁鍚屾鏈哄埗涓殑鏁版嵁鍜岃褰曟槸鍚﹀凡緇忚皟鐢ㄨ繃finalize鏂規硶鐨勪俊鎭?/span>
鍦?/span>Java涓湁鎸囦護鐢ㄤ簬鍦ㄥ唴瀛樹腑鍒嗛厤瀵硅薄錛屽嵈娌℃湁鏄懼紡鐨勬寚浠ゆ潵閲婃斁鍐呭瓨涓殑瀵硅薄銆?/span>
3.5 鏈湴鏂規硶鏍?/span>
褰?/span>Java鏂規硶璋冪敤鏈湴鏂規硶鐨勬椂鍊欙紝褰撳墠綰跨▼鐨勭▼搴忓瘎瀛樺櫒鏄笉紜畾鐨勫箋傜▼搴忕殑鎵ц涔熻漿鍚戞湰鍦版柟娉曘傛湰鍦版柟娉曞彲浠ユ甯歌繑鍥烇紝涔熷彲浠ユ姏鍑哄紓甯搞傛姏鍑虹殑寮傚父浼氬湪璋冪敤璇ユ湰鍦版柟娉曠殑鎸囦護涓噸鏂版姏鍑恒?/span>
4. 鎵ц寮曟搸
姣忎釜鐢ㄦ埛綰跨▼錛堝嵆涓嶅寘鎷瀮鍦懼洖鏀剁嚎紼嬬瓑錛夐兘鏈変竴涓墽琛屽紩鎿庡疄渚嬶紝鐢ㄤ互鎵ц瀛楄妭鐮佹寚浠ゃ?/span>
5. 鏈湴鏂規硶鎺ュ彛
Java紼嬪簭鍙互閫氳繃鏈湴鏂規硶鎺ュ彛鏉ヨ皟鐢ㄦ湰鍦版柟娉曘?br />
浜?010-10-06