Java
ClassÎļþÖаüº¬ÒÔÏÂÐÅÏ¢£º
ClassFile {
u4 magic; //Ä£Êý
u2 minor_version; //´Î°æ±¾ºÅ
u2 major_version; //Ö÷°æ±¾ºÅ
u2 constant_pool_count; //³£Á¿³Ø´óС
cp_info constant_pool[constant_pool_count-1]; //³£Á¿³Ø
u2 access_flags; //ÀàºÍ½Ó¿Ú²ã´ÎµÄ·ÃÎʱêÖ¾£¨Í¨¹ý|ÔËËãµÃµ½£©
u2 this_class; //ÀàË÷Òý£¨Ö¸Ïò³£Á¿³ØÖеÄÀà³£Á¿£©
u2 super_class; //¸¸ÀàË÷Òý£¨Ö¸Ïò³£Á¿³ØÖеÄÀà³£Á¿£©
u2 interfaces_count; //½Ó¿ÚË÷Òý¼ÆÊýÆ÷
u2 interfaces[interfaces_count]; //½Ó¿ÚË÷Òý¼¯ºÏ
u2 fields_count; //×Ö¶ÎÊýÁ¿¼ÆÊýÆ÷
field_info fields[fields_count]; //×Ö¶Î±í¼¯ºÏ
u2 methods_count; //·½·¨ÊýÁ¿¼ÆÊýÆ÷
method_info methods[methods_count]; //·½·¨±í¼¯ºÏ
u2 attributes_count; //ÊôÐÔ¸öÊý
attribute_info attributes[attributes_count]; //ÊôÐÔ±í
}
|
1. ͨ¹ýʵÀýÀ´¿´
public interface InterA {
void interA();
}
public interface InterB {
String interB(int i);
}
public interface InterC {
void interC();
}
public class Base implements InterA {
private int baseInt;
protected String baseString;
public int getBaseInt() {
return baseInt;
}
public void setBaseInt(int baseInt) {
this.baseInt = baseInt;
}
@Override
public void interA() {
System.out.println("the interA in Base");
}
}
public class Sub extends Base implements InterB, InterC {
private int subInt;
private static String subString;
private static Object subObject;
public int getSubInt() {
return subInt;
}
public void setSubInt(int subInt) {
this.subInt = subInt;
}
public static String getSubString() {
return subString;
}
public static void setSubString(String subString) {
Sub.subString = subString;
}
public static Object getSubObject() {
return subObject;
}
public static void setSubObject(Object subObject) {
Sub.subObject = subObject;
}
@Override
public void interC() {
System.out.println("the interC in Sub");
}
@Override
public String interB(int i) {
return "the interB in Sub";
}
}
|
ÎÒÃÇʹÓÃWinHex²é¿´SubÀàµÄ.classÎļþ£º

2. ħÊý
×÷ÓãºÈ·¶¨¸ÃÎļþÊÇ·ñÊÇÐéÄâ»ú¿É½ÓÊܵÄclassÎļþ¡£javaµÄħÊýͳһΪ 0xCAFEBABE (À´Ô´ÓÚÒ»¿î¿§·È)¡£
ÇøÓò£ºÎļþµÚ0~3×Ö½Ú¡£
3. °æ±¾ºÅ
×÷Ó㺱íʾclassÎļþµÄ°æ±¾£¬ÓÉminorversionºÍmajorversion×é³É¡£
ÇøÓò£ºÎļþµÚ4~7×Ö½Ú¡£
Èç

51´ú±í£¬jdkΪ1.7.0
ÐèҪעÒâµÄÊÇjava°æ±¾ºÅÊÇ´Ó45¿ªÊ¼µÄ£¬´ó°æ±¾·¢²¼£¬Ö÷°æ±¾ºÅ+1.¸ß°æ±¾µÄjdkÄÜÏòϼæÈÝÒÔǰ°æ±¾µÄclassÎļþ£¬µ«²»¼æÈÝÒÔºó°æ±¾µÄclassÎļþ¡£
4. ³£Á¿³Ø
³£Á¿³ØµÄ´óСÊDz»¹Ì¶¨µÄ£¬¸ù¾ÝÄãµÄÀàÖеij£Á¿µÄ¶àÉÙ¶ø¶¨£¬ËùÒÔÔÚ³£Á¿³ØµÄÈë¿Ú£¬·ÅÖÃÁËÒ»¸öu2ÀàÐ͵ıíʾ³£Á¿³ØÖг£Á¿¸öÊýµÄ³£Á¿³ØÈÝÁ¿¼ÆÊýÆ÷¡£¼ÆÊýÆ÷´Ó1¿ªÊ¼£¬µÚ0λÓÐÌØÊ⺬Ò壬±íʾָÏò³£Á¿³ØµÄË÷ÒýÖµÊý¾Ý²»ÒýÓÃÈκÎÒ»¸ö³£Á¿³ØÏîÄ¿¡£³ØÖеÄÊý¾ÝÏî¾ÍÏñÊý×éÒ»ÑùÊÇͨ¹ýË÷Òý·ÃÎʵġ£

ÎÒÃÇ¿ÉÒÔÇå³þµÄ¿´µ½£¬ÎÒÃdz£Á¿³ØÖÐÓÐ63-1=62¸ö³£Á¿¡£ÕâЩ³£Á¿ÊÇÊ²Ã´ÄØ£¿
Òª´æ·Å×ÖÃæÁ¿LiteralºÍ·ûºÅÒýÓÃSymbolic References¡£
×ÖÃæÁ¿¿ÉÄÜÊÇÎı¾×Ö·û´®£¬»òfinalµÄ³£Á¿Öµ¡£
·ûºÅÒýÓðüÀ¨ÒÔÏ£º
Àà»ò½Ó¿ÚÈ«ÏÞ¶¨Ãû Full Qualified Name
×Ö¶ÎÃû³ÆºÍÃèÊö·û Descriptor
·½·¨Ãû³ÆºÍÃèÊö·û
ÎÒÃÇʹÓ÷´±àÒ빤¾ß²é¿´Ò»Ï£º
E:\program\JVM\bin\com\gissky\clazz>javap -v Sub.class Classfile /E:/program/JVM/bin/com/gissky/clazz/Sub.class Last modified 2015-2-22; size 1363 bytes MD5 checksum 2dc77c79e4790422407eb7092085883c Compiled from "Sub.java" public class com.gissky.clazz.Sub extends com.gissky.
clazz.Base implements com.gissky.clazz.InterB,com.gissky.clazz.InterC SourceFile: "Sub.java" minor version: 0 major version: 51 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Class #2 // com/gissky/clazz/Sub ¡úÀàºÍ½Ó¿ÚµÄÈ«ÏÞ¶¨Ãû #2 = Utf8 com/gissky/clazz/Sub #3 = Class #4 // com/gissky/clazz/Base #4 = Utf8 com/gissky/clazz/Base #5 = Class #6 // com/gissky/clazz/InterB #6 = Utf8 com/gissky/clazz/InterB #7 = Class #8 // com/gissky/clazz/InterC #8 = Utf8 com/gissky/clazz/InterC #9 = Utf8 subInt #10 = Utf8 I #11 = Utf8 subString #12 = Utf8 Ljava/lang/String; #13 = Utf8 subObject #14 = Utf8 Ljava/lang/Object; #15 = Utf8 <init> #16 = Utf8 ()V #17 = Utf8 Code #18 = Methodref #3.#19 // com/gissky/clazz/Base."<init>":()V #19 = NameAndType #15:#16 // "<init>":()V #20 = Utf8 LineNumberTable #21 = Utf8 LocalVariableTable #22 = Utf8 this #23 = Utf8 Lcom/gissky/clazz/Sub; #24 = Utf8 getSubInt #25 = Utf8 ()I #26 = Fieldref #1.#27 // com/gissky/clazz/Sub.subInt:I
¡ú ÀàÖÐ×ֶεķûºÅÒýÓà #27 = NameAndType #9:#10 // subInt:I
¡ú ÀàÖÐ×ֶεIJ¿·Ö·ûºÅÒýÓÃÖ®Ãû³ÆºÍÀàÐÍ #28 = Utf8 setSubInt #29 = Utf8 (I)V #30 = Utf8 getSubString #31 = Utf8 ()Ljava/lang/String; #32 = Fieldref #1.#33 // com/gissky/clazz/Sub.subString:Ljava/lang/String; #33 = NameAndType #11:#12 // subString:Ljava/lang/String; #34 = Utf8 setSubString #35 = Utf8 (Ljava/lang/String;)V #36 = Utf8 getSubObject #37 = Utf8 ()Ljava/lang/Object; #38 = Fieldref #1.#39 // com/gissky/clazz/Sub.subObject:Ljava/lang/Object; #39 = NameAndType #13:#14 // subObject:Ljava/lang/Object; #40 = Utf8 setSubObject #41 = Utf8 (Ljava/lang/Object;)V #42 = Utf8 interC #43 = Fieldref #44.#46 // java/lang/System.out:Ljava/io/PrintStream; #44 = Class #45 // java/lang/System #45 = Utf8 java/lang/System #46 = NameAndType #47:#48 // out:Ljava/io/PrintStream; #47 = Utf8 out #48 = Utf8 Ljava/io/PrintStream; #49 = String #50 // the interC in Sub #50 = Utf8 the interC in Sub #51 = Methodref #52.#54 // java/io/PrintStream.println:(Ljava/lang/String;)V #52 = Class #53 // java/io/PrintStream #53 = Utf8 java/io/PrintStream #54 = NameAndType #55:#35 // println:(Ljava/lang/String;)V #55 = Utf8 println #56 = Utf8 interB #57 = Utf8 (I)Ljava/lang/String; #58 = String #59 // the interB in Sub
¡ú·½·¨ÖÐÓõ½µÄString³£Á¿ #59 = Utf8 the interB in Sub #60 = Utf8 i #61 = Utf8 SourceFile #62 = Utf8 Sub.java |
³£Á¿³ØÖеÄÏîÄ¿ÀàÐÍÈçÏ£º
CONSTANT_Utf8_info tag±ê־λΪ1, UTF-8±àÂëµÄ×Ö·û´®
CONSTANT_Integer_info tag±ê־λΪ3£¬ ÕûÐÎ×ÖÃæÁ¿
CONSTANT_Float_info tag±ê־λΪ4£¬ ¸¡µãÐÍ×ÖÃæÁ¿
CONSTANT_Long_info tag±ê־λΪ5£¬ ³¤ÕûÐÎ×ÖÃæÁ¿
CONSTANT_Double_info tag±ê־λΪ6£¬ Ë«¾«¶È×ÖÃæÁ¿
CONSTANT_Class_info tag±ê־λΪ7£¬ Àà»ò½Ó¿ÚµÄ·ûºÅÒýÓÃ
CONSTANT_String_info tag±ê־λΪ8£¬×Ö·û´®ÀàÐ͵Ä×ÖÃæÁ¿
CONSTANT_Fieldref_info tag±ê־λΪ9, ×ֶεķûºÅÒýÓÃ
CONSTANT_Methodref_info tag±ê־λΪ10£¬ÀàÖз½·¨µÄ·ûºÅÒýÓÃ
CONSTANT_InterfaceMethodref_info tag±ê־λΪ11,
½Ó¿ÚÖз½·¨µÄ·ûºÅÒýÓÃ
CONSTANT_NameAndType_info tag ±ê־λΪ12£¬×ֶκͷ½·¨µÄÃû³ÆÒÔ¼°ÀàÐ͵ķûºÅÒýÓÃ
5. Àà»ò½Ó¿Ú·ÃÎʱêÖ¾
±íʾÀà»òÕß½Ó¿Ú·½ÃæµÄ·ÃÎÊÐÅÏ¢£¬±ÈÈçClass±íʾµÄÊÇÀ໹Êǽӿڣ¬ÊÇ·ñΪpublic¡¢static¡¢finalµÈ¡££¬ÏÂÃæÎÒÃǾÍÀ´¿´¿´TestClassµÄ·ÃÎʱêʾ¡£ClassµÄ·ÃÎʱê־ֵΪ0¡Á0021£º

¸ù¾ÝÇ°ÃæËµµÄ¸÷ÖÖ·ÃÎʱêʾµÄ±ê־룬ÎÒÃÇ¿ÉÒÔÖªµÀ£º0¡Á0021=0¡Á0001|0¡Á0020
Ò²¼´ACC_PUBLIC ºÍ ACC_SUPERÎªÕæ£¬ÆäÖÐACC_PUBLIC´ó¼ÒºÃÀí½â£¬ACC_SUPERÊÇjdk1.2Ö®ºó±àÒëµÄÀà¶¼»á´øÓеıêÖ¾¡£

6. ÀàË÷Òý¡¢¸¸ÀàË÷ÒýÓë½Ó¿ÚË÷Òý¼¯ºÏ
ClassÎļþÖÐÓÉÕâ3ÏîÊý¾ÝÀ´È·¶¨ÀàµÄ¼Ì³Ð¹ØÏµ¡£
ÀàË÷ÒýºÍ¸¸ÀàË÷Òý¶¼ÊÇÖ¸Ïò³£Á¿³ØÖеij£Á¿Ë÷Òý£º

½ô½ÓןóÃæÊÇÒ»¸ö½Ó¿ÚµÄ¼ÆÊýÆ÷ºÍ½Ó¿ÚÃèÊö·û£º

7. ×Ö¶Î±í¼¯ºÏ
×÷ÓãºÃèÊö½Ó¿Ú»òÕßÀàÖÐÉùÃ÷µÄÀà±äÁ¿ÒÔ¼°ÊµÀý±äÁ¿£¬²»°üÀ¨·½·¨Öеľֲ¿±äÁ¿¡£
½ô½Ó׎ӿÚË÷Òý¼¯ºÏÖ®ºóµÄ2×Ö½ÚÊÇ×ֶμÆÊýÆ÷£º

±íʾÎÒÃÇÀàÖÐÓÐ3¸ö×ֶΣ¬ÕâÀï±ãÊÇsubInt¡¢subString¡¢subObject 3¸ö×ֶΡ£½ô½ÓÆäºóµÄÊÇ×Ö¶Î±í£¬×ֶαí½á¹¹Îª£º
field_info
{
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}
|

access_flagsÏîµÄÖµÊÇÓÃÓÚ¶¨Òå×ֶα»·ÃÎÊȨÏ޺ͻù´¡ÊôÐÔµÄÑÚÂë±êÖ¾¡£È¡Öµ·¶Î§ÈçÏÂ±í£º

ÃèÊö·û±êʶ×Ö·ûº¬Ò壺

V ±íÊ¾ÌØÊâÀàÐÍvoid¡£
¶ÔÓÚÊý×éÀàÐÍ£¬Ã¿Ò»¸öά¶È½«Ê¹ÓÃÒ»¸öǰÖõġ±["×Ö·ûÀ´ÃèÊö£¬ÈçÒ»¸ö¶¨ÒåµÄ"java.lang.String[][]¡°ÀàÐ͵ĶþάÊý×飬½«±»¼Ç¼Ϊ:¡±[[Ljava/lang/String;",Ò»¸öÕûÐÍÊý×é"int[]¡°½«±»¼Ç¼Ϊ¡±[I"
¸¸ÀàÖеÄ×ֶβ»»á³öÏÖÔÚ×ÓÀàµÄ×ֶαíÖС£
8. ·½·¨±í¼¯ºÏ
×Ö¶Î±í¼¯ºÏ½áÊøºó±ãÊÇ·½·¨±í¼¯ºÏ¡£
×÷ÓãºÃèÊö¸ÃÀàÖеķ½·¨¡£
ºÍ×ֶαíÒ»Ñù£¬Ê¹ÓÃÒ»¸öu2ÀàÐ͵ķ½·¨¼ÆÊýÆ÷£¬¼Ç¼¸ÃÀàÖз½·¨µÄ¸öÊý¡£

±íʾÎÒÃǵÄÀàÖÐÓÐ9¸ö·½·¨¡£
·½·¨±íµÄ½á¹¹ÈçÏÂͼËùʾ

ÆäÖÐname_indexºÍdescriptor_index±íʾµÄÊÇ·½·¨µÄÃû³ÆºÍÃèÊö·û£¬ËûÃÇ·Ö±ðÊÇÖ¸Ïò³£Á¿³ØµÄË÷Òý¡£ÕâÀïÐèÒª½á½âÊÍһϷ½·¨µÄÃèÊö·û£¬·½·¨µÄÃèÊö·ûµÄ½á¹¹Îª£º£¨²ÎÊýÁÐ±í£©·µ»ØÖµ£¬±ÈÈçpublic
int instanceMethod(int param)µÄÃèÊö·ûΪ£º£¨I£©I£¬±íʾ´øÓÐÒ»¸öintÀàÐͲÎÊýÇÒ·µ»ØÖµÒ²ÎªintÀàÐ͵ķ½·¨£¬·½·¨java.lang.String.toString()µÄÃèÊö·ûΪ"()Ljava/lang/String;"£¬int
IndexOf(char[] source,int sourceOffset,int sourceCount,char[]
target int targetOffset,int targetCount,int fromIndex)
±íʾΪ([CII[CII)I¡£½ÓÏÂÀ´¾ÍÊÇÊôÐÔÊýÁ¿ÒÔ¼°ÊôÐÔ±íÁË£¬·½·¨±íºÍ×ֶαíËäÈ»¶¼ÓÐ ÊôÐÔÊýÁ¿ºÍÊôÐÔ±í£¬µ«ÊÇËûÃÇÀïÃæËù°üº¬µÄÊôÐÔÊDz»Í¬¡£

Èç¹û¸¸Àà·½·¨ÔÚ×ÓÀàÖÐûÓб»ÖØÐ´£¨@Override£©£¬·½·¨±íÖоͲ»»á³öÏÖÀ´×Ô¸¸ÀàµÄ·½·¨ÐÅÏ¢¡£
9. ÊôÐÔ±í¼¯ºÏ
ÉÏÃæµÄ·½·¨±íÖÐÎÒÃǾͿ´µ½<init>·½·¨ÓÐÒ»¸öCodeµÄÊôÐÔ¡£ÔÚ±¾½ÚÎÒÃǽ«²ûÊöÕâЩÊôÐÔ£º
CodeÊôÐÔ£º
¸ÃÊôÐÔÀïÖ÷Òª´æ·ÅÓÉjavac±àÒëÆ÷´¦ÀíºóµÃµ½µÄ×Ö½ÚÂëÖ¸Áî¡£

ÆäÖÐattribute_name_indexÖ¸Ïò³£Á¿³ØÖÐֵΪCodeµÄ³£Á¿£¬attribute_lengthµÄ³¤¶È±íʾCodeÊôÐÔ±íµÄ³¤¶È£¨ÕâÀï
ÐèҪעÒâµÄʱºò³¤¶È²»°üÀ¨attribute_name_indexºÍattribute_lengthµÄ6¸ö×ֽڵij¤¶È£©¡£
max_stack±íʾ×î´óÕ»Éî¶È£¬ÐéÄâ»úÔÚÔËÐÐʱ¸ù¾ÝÕâ¸öÖµÀ´·ÖÅäÕ»Ö¡ÖвÙ×÷ÊýµÄÉî¶È£¬¶ømax_locals´ú±íÁ˾ֲ¿±äÁ¿±íËùÐèµÄ´æ´¢¿Õ¼ä¡£
max_localsµÄµ¥Î»Îªslot£¬slotÊÇÐéÄâ»úΪ¾Ö²¿±äÁ¿·ÖÅäÄÚ´æµÄ×îСµ¥Ôª£¬ÔÚÔËÐÐʱ£¬¶ÔÓÚ²»³¬¹ý32λÀàÐ͵ÄÊý¾ÝÀàÐÍ£¬±ÈÈç
byte,char,intµÈÕ¼ÓÃ1¸öslot£¬¶ødoubleºÍLongÕâÖÖ64λµÄÊý¾ÝÀàÐÍÔòÐèÒª·ÖÅä2¸öslot£¬ÁíÍâmax_localsµÄÖµ²¢²»ÊÇËùÓоֲ¿±äÁ¿ËùÐèÒªµÄÄÚ´æÊýÁ¿Ö®ºÍ£¬ÒòΪslotÊÇ¿ÉÒÔÖØÓõ쬵±¾Ö²¿±äÁ¿³¬¹ýÁËËüµÄ×÷ÓÃÓòÒԺ󣬾ֲ¿±äÁ¿ËùÕ¼ÓõÄslot¾Í»á±»ÖØÓ᣷½·¨²ÎÊý¡¢ÏÔʾÒì³£´¦ÀíÆ÷µÄ²ÎÊý¡¢·½·¨ÌåÖж¨ÒåµÄ¾Ö²¿±äÁ¿¶¼ÒªÊ¹Óþֲ¿±äÁ¿±íÀ´´æ·Å¡£
code_length´ú±íÁË×Ö½ÚÂëÖ¸ÁîµÄÊýÁ¿£¬¶øcode±íʾµÄÊÇ×Ö½ÚÂëÖ¸Á´ÓÉÏͼ¿ÉÒÔÖªµÀcodeµÄÀàÐÍΪu1,Ò»¸öu1ÀàÐ͵ÄȡֵΪ0x00-0xFF,¶ÔÓ¦µÄÊ®½øÖÆÎª0-255£¬Ä¿Ç°ÐéÄâ»ú¹æ·¶ÒѾ¶¨ÒåÁË200¶àÌõÖ¸Áî¡£
exception_table_lengthÒÔ¼°exception_table·Ö±ð´ú±í·½·¨¶ÔÓ¦µÄÒì³£ÐÅÏ¢¡£
attributes_countºÍattribute_info·Ö±ð±íʾÁËCodeÊôÐÔÖеÄÊôÐÔÊýÁ¿ºÍÊôÐÔ±í£¬´ÓÕâÀï¿ÉÒÔ¿´³öClassµÄÎļþ½á¹¹ÖУ¬ÊôÐÔ±íÊǺÜÁé»îµÄ£¬Ëü¿ÉÒÔ´æÔÚÓÚClassÎļþ£¬·½·¨±í£¬×ֶαíÒÔ¼°CodeÊôÐÔÖС£
ÐÞ¸ÄÒ»ÏÂSubÖеÄInterB·½·¨£º
@Override
public int interB(int i){
int x=0;
try{
x+=i;
return x;
}catch(Exception e){
x=-1;
return x;
}finally{
x=3;
}
}
|
´ó¼Ò²»·ÁÏȲÂÒ»ÏÂÕâ¸öº¯ÊýµÄ½á¹ûÊÇʲô£¿¼ÙÈçÔÚtry¿éÖз¢ÉúÒì³££¬½á¹¹ÓÖÊÇʲô£¿ÎÒÏàÐŶÔJavaÓïÑÔÊìϤµÄÅóÓÑ£¬¿Ï¶¨ÖªµÀ´ð°¸¡£
ʹÓ÷´±àÒ빤¾ß²é¿´£º
public int interB(int);
flags: ACC_PUBLIC
Code:
stack=2, locals=6, args_size=2
0: iconst_0
1: istore_2
2: iload_2
3: iload_1
4: iadd
5: istore_2
6: iload_2
7: istore 5
9: iconst_3
10: istore_2
11: iload 5
13: ireturn
14: astore_3
15: iconst_m1
16: istore_2
17: iload_2
18: istore 5
20: iconst_3
21: istore_2
22: iload 5
24: ireturn
25: astore 4
27: iconst_3
28: istore_2
29: aload 4
31: athrow
Exception table:
from to target type
2 9 14 Class java/lang/Exception
2 9 25 any
14 20 25 any
LineNumberTable:
line 35: 0
line 37: 2
line 38: 6
line 43: 9
line 38: 11
line 39: 14
line 40: 15
line 41: 17
line 43: 20
line 41: 22
line 42: 25
line 43: 27
line 44: 29
LocalVariableTable:
Start Length Slot Name Signature
0 32 0 this Lcom/gissky/clazz/Sub;
0 32 1 i I
2 30 2 x I
15 10 3 e Ljava/lang/Exception;
StackMapTable: number_of_entries = 2
frame_type = 255 /* full_frame */
offset_delta = 14
locals = [ class com/gissky/clazz/Sub, int, int ]
stack = [ class java/lang/Exception ]
frame_type = 74 /* same_locals_1_stack_item */
stack = [ class java/lang/Throwable ]
}
|
´Ó args_size=2ÕâÌõ·´±àÒë´úÂ룬ÎÒÃÇ¿ÉÒÔÖªµÀ£¬ÔÚpublic int interB(int
i)Õâ¸ö·½·¨ÖÐÓÐ6¸ö¾Ö²¿±äÁ¿£¬2¸ö²ÎÊý£¬¿ÉÊÇÎÒÃǵĺ¯ÊýÖÐÃ÷Ã÷Ö»ÓÐÒ»¸ö²ÎÊýô¡¡ÕâÊÇÒòΪ±àÒëÆ÷»áΪÿһ¸öʵÀýº¯Êý°üÀ¨¹¹ÔìÆ÷Ìí¼ÓÒ»¸ö²ÎÊýthis£¬ÔÚJVMµ÷Óø÷½·¨µÄʱºò»á¸ÃÐβδ«µÝÒ»¸öʵ²Î¡ª·½·¨ËùÔÚ¶ÔÏóµÄ×ÔÉí¡£
Exception table:
from to target type
2 9 14 Class java/lang/Exception
2 9 25 any
14 20 25 any
Éϱí±íÍ·±íʾ£¬µ±×Ö½ÚÂëÔÚformÐе½toÐУ¨²»°üÀ¨toÐУ©³öÏÖÀàÐÍΪtypeµÄÒì³££¬Ôòתµ½µÚtargetÐмÌÐø´¦Àí¡£
´Ó·½·¨µÄÒì³£±íÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½Õâ¸öº¯ÊýÓÐ3ÌõÖ´Ðз¾¶£º
ÕâÀïÎÒÃDzåÈë²ûÊöÒ»ÏÂLineNumberTable±íµÄº¬Ò壺Ëü±íʾJavaÔ´ÂëÐкÅÓë×Ö½ÚÂëÐкÅÖ®¼äµÄ¶ÔÓ¦¹ØÏµ¡£

¶ÔÕÕÉÏͼ£¬ÎÒÃÇÄÜÇåÎúµÄ¿´³öÕâ3Ìõ·¾¶¡£
ÖªµÀÁ˸÷½·¨Ö´ÐеÄ3Ìõ·¾¶£¬ÎÒÃÇÒ²¾ÍÖªµÀ¸Õ²ÅÎÒÃǵÄÄǸöÎÊÌâÓÐ3¸ö´ð°¸£ºÃ»ÓÐÒì³£ÊÇΪx+i£»try¿éÖгöÏÖExceptionÀàÐ͵ĴíÎóʱ£¬·µ»Ø-1£»³öÏÖExceptionÒÔÍâµÄÈκÎÒì³£·½·¨·ÇÕý³£½áÊø£¬Ã»Óзµ»ØÖµ¡£
LocalVariableTable:
Start Length Slot Name Signature
0 32 0 this Lcom/gissky/clazz/Sub;
0 32 1 i I
2 30 2 x I
15 10 3 e Ljava/lang/Exception;
LocalVariableTable±íʾ¾Ö²¿±äÁ¿±í£¬ÃèÊö·½·¨Öоֲ¿±äÁ¿¡£
Èç¹ûÄã¶Ô·µ»ØµÄ´ð°¸ÄÜÀí½âµÄ»°£¬ÄÇôÎÒÏàÐÅÄãÒ²¿Ï¶¨ÖªµÀ£¬ÎÒÃǺ¯ÊýÖÐÖ»ÓÐ4¸ö²ÎÊý£¬µ«max_localsÈ´µÈÓÚ6¡£²»¶®µÄ»°×Ðϸ¿´Ò»ÏÂCodeÖÐ×Ö½ÚÂëµÄÖ´Ðйý³Ì±ä¿ÉÒÔÀí½âÁË¡£
Ò»¸ö·½·¨ÔÚÖ´ÐÐʱÐèÒª¶à´óµÄ¾Ö²¿±äÁ¿¿Õ¼äÔÚ±àÒëʱÆÚ¾ÍÖªµÀÁË£¬·½·¨Ö´ÐÐÆÚ¼ä²»»á¸Ä±ä¾Ö²¿±äÁ¿±íµÄ´óС¡£
Signature ÊôÐÔ£º
¸ÃÊôÐÔÊÇÔÚJDK1.5ÐÂÔöµÄ¡£¸ÃÊôÐÔ¿ÉÓÃÓÚÀà¡¢ÊôÐÔ±íºÍ·½·¨±í½á¹¹µÄÊôÐÔ±íÖС£Ê¹Ó÷ºÐÍÇ©ÃûÈç¹û°üº¬ÁËÀàÐͱäÁ¿£¨Type
Variables£©»ò²ÎÊý»¯ÀàÐÍ£¨Parameterized Types£©£¬ÔòSignature ÊôÐÔ»áΪËü¼Ç¼·ºÐÍÇ©ÃûÐÅÏ¢¡£µ±ÎÒÃÇÒª·ºÐÍÀàÖÐÄõ½·ºÐ͵Äʵ¼ÊÀàÐ͵Äʱºò·Ç³£ÓÐÓá£

ʵÀý£º
ÔÚʹÓÃHibernateʱ£¬ÎÒϰ¹ß½«ÎªDao²ã·â×°Ò»¸ö·ºÐÍ»ùÀ࣬À´·ÅÖÃһЩͨÓõķ½·¨£¬¶øHibernateÓкܶ෽·¨¶¼Òª´«µÝÒ»¸öPOJOµÄÀàÐÍ£¬È»ºó½øÐвéѯ£¬Èçload·½·¨¡£ÎÒÃǹ¹½¨ÕâÑùµÄÒ»¸ö»ùÀࣺ
public abstract class BaseDaoImpl<T, PK extends
Serializable> extends HibernateDaoSupport implements
BaseDao<T, PK>
ÄÇôloadÖÐҪʹÓõÄPOJOÀàÐͱãÊÇTµÄʵ¼ÊÀàÐÍ¡£ÔõôÀ´Äǵ¹Õâ¸öÊôÐÔÄØ£¿ÕâÀï±ßҪʹÓõ½SignatureÊôÐÔÁË¡£
public abstract class BaseDaoImpl<T, PK extends Serializable> extends HibernateDaoSupport implements BaseDao<T, PK> {
private Class<T> entityClass;
@SuppressWarnings("unchecked")
public BaseDaoImpl() {
//class OrgDao extends BaseDaoImpl<Organization,
String> implements OrgDao {}
Class c = this.getClass(); //·µ»ØµÄÊÇʹÓÃnew´´½¨µÄ·ºÐÍÀà¶ÔÓ¦µÄ¶ÔÏóµÄclass¶ÔÏó¡£
Type type = c.getGenericSuperclass(); //È¡µÃ¸Ã¶ÔÏóµÄ·ºÐÍÀà
//È¡µÃ·ºÐͶÔÓ¦µÄÕæÕýµÄclass£¬²¢·Åµ½Êý×éÖÐ
Type[] types = ((ParameterizedType)type).getActualTypeArguments();
entityClass = (Class<T>) types[0];
} |
Õâʱ£¬getByIdÖоͿÉÒÔÖ±½ÓʹÓÃÁË£º
public T getById(PK id) { return (T) getHibernateTemplate().load(entityClass, id); } |
|