我们先来给出一个java程序源码:================================================================= import java.io.*;public class ByteWriter implements Serializable{private final String CR = "\r\n";public void writeBytes(File in, File out) throws IOException{InputStream is = new FileInputStream(in);FileWriter fw = new FileWriter(out);int i;int count = 0;String byteStr;while((i=is.read())!=-1){byteStr = Integer.toHexString(i).toUpperCase();if(byteStr.length()==1)byteStr = "0" + byteStr;fw.write(byteStr+" ");count++;if(count%16==0)fw.write(CR);}fw.flush();}public static void main(String[] args) throws Exception{new ByteWriter().writeBytes(new File(args[0]), new File(args[1]));}}编译ByteWriter.java文件,生成ByteWriter.class文件如下(十六进制字节码):CA FE BA BE 00 00 00 31 00 58 0A 00 19 00 2B 0800 2C 09 00 14 00 2D 07 00 2E 0A 00 04 00 2F 0700 30 0A 00 06 00 2F 0A 00 31 00 32 0A 00 33 0034 0A 00 35 00 36 0A 00 35 00 37 07 00 38 0A 000C 00 2B 08 00 39 0A 00 0C 00 3A 0A 00 0C 00 3B08 00 3C 0A 00 06 00 3D 0A 00 06 00 3E 07 00 3F0A 00 14 00 2B 07 00 40 0A 00 16 00 41 0A 00 1400 42 07 00 43 07 00 44 01 00 02 43 52 01 00 124C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E67 3B 01 00 0D 43 6F 6E 73 74 61 6E 74 56 61 6C 75 65 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29 56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 01 00 0A 77 72 69 74 65 42 79 74 65 73 01 00 1F 28 4C 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 3B 4C 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 3B 29 56 01 00 0A 45 78 63 65 70 74 69 6F 6E 73 07 00 45 01 00 04 6D 61 69 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 07 00 46 01 00 0A 53 6F 75 72 63 65 46 69 6C 65 01 00 0F 42 79 74 65 57 72 69 74 65 72 2E 6A 61 76 61 0C 00 1E 00 1F 01 00 02 0D 0A 0C 00 1B 00 1C 01 00 17 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 49 6E 70 75 74 53 74 72 65 61 6D 0C 00 1E 00 47 01 00 12 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 57 72 69 74 65 72 07 00 48 0C 00 49 00 4A 07 00 4B 0C 00 4C 00 4D 07 00 4E 0C 00 4F 00 50 0C 00 51 00 4A 01 00 17 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 01 00 01 30 0C 00 52 00 53 0C 00 54 00 50 01 00 01 20 0C 00 55 00 56 0C 00 57 00 1F 01 00 0A 42 79 74 65 57 72 69 74 65 72 01 00 0C 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 0C 00 1E 00 56 0C 00 22 00 23 01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 01 00 14 6A 61 76 61 2F 69 6F 2F 53 65 72 69 61 6C 69 7A 61 62 6C 65 01 00 13 6A 61 76 61 2F 69 6F 2F 49 4F 45 78 63 65 70 74 69 6F 6E 01 00 13 6A 61 76 61 2F 6C 61 6E 67 2F 45 78 63 65 70 74 69 6F 6E 01 00 11 28 4C 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 3B 29 56 01 00 13 6A 61 76 61 2F 69 6F 2F 49 6E 70 75 74 53 74 72 65 61 6D 01 00 04 72 65 61 64 01 00 03 28 29 49 01 00 11 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 01 00 0B 74 6F 48 65 78 53 74 72 69 6E 67 01 00 15 28 49 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 01 00 0B 74 6F 55 70 70 65 72 43 61 73 65 01 00 14 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 01 00 06 6C 65 6E 67 74 68 01 00 06 61 70 70 65 6E 64 01 00 2D 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 3B 01 00 08 74 6F 53 74 7269 6E 67 01 00 05 77 72 69 74 65 01 00 15 28 4C6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 673B 29 56 01 00 05 66 6C 75 73 68 00 21 00 14 0019 00 01 00 1A 00 01 00 12 00 1B 00 1C 00 01 001D 00 00 00 02 00 02 00 03 00 01 00 1E 00 1F 0001 00 20 00 00 00 27 00 02 00 01 00 00 00 0B 2AB7 00 01 2A 12 02 B5 00 03 B1 00 00 00 01 00 2100 00 00 0A 00 02 00 00 00 03 00 04 00 05 00 0100 22 00 23 00 02 00 20 00 00 00 C6 00 03 00 0800 00 00 7E BB 00 04 59 2B B7 00 05 4E BB 00 0659 2C B7 00 07 3A 04 03 36 06 2D B6 00 08 59 3605 02 9F 00 5A 15 05 B8 00 09 B6 00 0A 3A 07 1907 B6 00 0B 04 A0 00 19 BB 00 0C 59 B7 00 0D 120E B6 00 0F 19 07 B6 00 0F B6 00 10 3A 07 19 04BB 00 0C 59 B7 00 0D 19 07 B6 00 0F 12 11 B6 000F B6 00 10 B6 00 12 84 06 01 15 06 10 10 70 9AFF AB 19 04 12 02 B6 00 12 A7 FF A1 19 04 B6 0013 B1 00 00 00 01 00 21 00 00 00 36 00 0D 00 0000 08 00 09 00 09 00 13 00 0B 00 16 00 0D 00 2100 0E 00 2B 00 0F 00 34 00 10 00 4A 00 11 00 6300 12 00 66 00 13 00 6E 00 14 00 78 00 16 00 7D00 17 00 24 00 00 00 04 00 01 00 25 00 09 00 2600 27 00 02 00 20 00 00 00 3B 00 06 00 01 00 0000 1F BB 00 14 59 B7 00 15 BB 00 16 59 2A 03 32B7 00 17 BB 00 16 59 2A 04 32 B7 00 17 B6 00 18B1 00 00 00 01 00 21 00 00 00 0A 00 02 00 00 001A 00 1E 00 1B 00 24 00 00 00 04 00 01 00 28 0001 00 29 00 00 00 02 00 2A下面我们来详细说明这些字节码的结构:CA FE BA BE:魔法数,每个正确的Java 类文件都是以此开头的00 00 00 31:版本信息,V49.0(前两个字节是minor version,后两个字节是major version)00 58:常量池元素个数加1,即有87个常量接下来是Constant pool信息0A 00 19 00 2B:0A, 代表method引用,00 19,method所属类为索引在25的class定义,00 2B,method的方法签名定义为索引在43的NameAndType定义08 00 2C:08,代表String引用,00 2C,String引用指向索引在44的字符串常量09 00 14 00 2D:09,代表field引用,00 14,field所属类为索引在20的class定义,00 2D,field的名称类型定义为索引在45的NameAndType定义07 00 2E:07,代表class定义,00 2E,class名称为索引在46的字符串常量0A 00 04 00 2F:所属类:java/io/FileInputStream;方法签名定义:"<init>":(Ljava/io/File;)V 07 00 30:class名称:java/io/FileWriter0A 00 06 00 2F:所属类:java/io/FileWriter;方法签名定义:"<init>":(Ljava/io/File;)V0A 00 31 00 32:所属类:java/io/InputStream;方法签名定义:read:()I0A 00 33 00 34:所属类:java/lang/Integer;方法签名定义:toHexString:(I)Ljava/lang/String; 0A 00 35 00 36:所属类:java/lang/String;方法签名定义:toUpperCase:()Ljava /lang/String; 0A 00 35 00 37:所属类:java/lang/String;方法签名定义:length:()I07 00 38:class名称:java/lang/StringBuilder0A 00 0C 00 2B:所属类:java/lang/StringBuilder;方法签名定义:"<init>":()V08 00 39:指向常量“0”0A 00 0C 00 3A:所属类:java/lang/StringBuilder;方法签名定义:append:(Ljav a/lang/String;)Ljava/lang/StringBuilder;0A 00 0C 00 3B:所属类:java/lang/StringBuilder;方法签名定义:toString:()Ljava/lang/String;08 00 3C:指向常量“\u0020”0A 00 06 00 3D:所属类:java/io/FileWriter;方法签名定义:write:(Ljava/lang/String; )V0A 00 06 00 3E:所属类:java/io/FileWriter;方法签名定义:flush:()V07 00 3F:class名称:ByteWriter0A 00 14 00 2B:所属类:ByteWriter;方法签名定义:"<init>":()V07 00 40:class名称:java/io/File0A 00 16 00 41:所属类:java/io/File;方法签名定义:"<init>":(Ljava/lang/String;)V0A 00 14 00 42:所属类:ByteWriter;方法签名定义:writeBytes:(Ljava/io/File;Ljava/io/File;)V 07 00 43:class名称:java/lang/Object07 00 44:class名称:java/io/Serializable01 00 02 43 52:01,代表UTF-8编码的常量,00 02,长度为2,43 52,“CR”01 00 12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B:“Ljava/lang/String;”01 00 0D 43 6F 6E 73 74 61 6E 74 56 61 6C 75 65:“ConstantValue”01 00 06 3C 69 6E 69 74 3E:“<init>”01 00 03 28 29 56:“()V”01 00 04 43 6F 64 65:“Code”01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65:“LineNumberTable”01 00 0A 77 72 69 74 65 42 79 74 65 73:“writeBytes”01 00 1F 28 4C 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 3B 4C 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 3B 29 56:“(Ljava/io/File;Ljava/io/File;)V”01 00 0A 45 78 63 65 70 74 69 6F 6E 73:“Exceptions”07 00 45:class名称:java/io/IOException01 00 04 6D 61 69 6E:“main”01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56:“([Ljava/lang/String;)V”07 00 46:class名称:java/lang/Exception01 00 0A 53 6F 75 72 63 65 46 69 6C 65:SourceFile01 00 0F 42 79 74 65 57 72 69 74 65 72 2E 6A 61 76 61:ByteWriter.java0C 00 1E 00 1F:0C,代表NameAndType定义,00 1E,Name定义为索引在30的字符串常量,00 1F,Type定义为索引在31的字符串常量01 00 02 0D 0A:“\r\n”0C 00 1B 00 1C:Name:“CR”Type:“Ljava/lang/String;”01 00 17 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 49 6E 70 75 74 53 74 72 65 61 6D:“java/io/FileInputStream”0C 00 1E 00 47:Name:“<init>”Type:“(Ljava/io/File;)V”01 00 12 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 57 72 69 74 65 72:“java/io/FileWriter”07 00 48:class名称:java/io/InputStream0C 00 49 00 4A:Name:“read”Type:“()I”07 00 4B:class名称:java/lang/Integer0C 00 4C 00 4D:Name:“toHexString”Type:“(I)Ljava/lang/String;”07 00 4E:class名称:java/lang/String0C 00 4F 00 50:Name:“toUpperCase”Type:“()Ljava/lang/String;”0C 00 51 00 4A:Name:“length”Type:“()I”01 00 17 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72:“java/lang/StringBuilder”01 00 01 30:“0”0C 00 52 00 53:Name:“append”Type:“(Ljava/lang/String;)Ljava/lang/StringBuilder;”0C 00 54 00 50:Name:“toString”Type:“()Ljava/lang/String;”01 00 01 20:“\u0020”0C 00 55 00 56:Name:“write”Type:“(Ljava/lang/String;)V”0C 00 57 00 1F:Name:“flush”Type:“()V”01 00 0A 42 79 74 65 57 72 69 74 65 72:“ByteWriter”01 00 0C 6A 61 76 61 2F 69 6F 2F 46 69 6C 65:“java/io/File”0C 00 1E 00 56:Name:“<init>”Type:“(Ljava/lang/String;)V”0C 00 22 00 23:Name:“writeBytes”Type:“(Ljava/io/File;Ljava/io/File;)V”01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74:“java/lang/Object”01 00 14 6A 61 76 61 2F 69 6F 2F 53 65 72 69 61 6C 69 7A 61 62 6C 65:“java/io/Serializable”01 00 13 6A 61 76 61 2F 69 6F 2F 49 4F 45 78 63 65 70 74 69 6F 6E:“java/io/IOException”01 00 13 6A 61 76 61 2F 6C 61 6E 67 2F 45 78 63 65 70 74 69 6F 6E:“java/lang/Exception”01 00 11 28 4C 6A 61 76 61 2F 69 6F 2F 46 69 6C 65 3B 29 56:“(Ljava/io/File;)V”01 00 13 6A 61 76 61 2F 69 6F 2F 49 6E 70 75 74 53 74 72 65 61 6D:“java/io/InputStream”01 00 04 72 65 61 64:“read”01 00 03 28 29 49:“()I”01 00 11 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72:“java/lang/Integer”01 00 0B 74 6F 48 65 78 53 74 72 69 6E 67:“toHexString”01 00 15 28 49 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B:“(I)Ljava/lang/String;”01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67:“java/lang/String”01 00 0B 74 6F 55 70 70 65 72 43 61 73 65:“toUpperCase”01 00 14 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B:“()Ljava/lang/String;”01 00 06 6C 65 6E 67 74 68:“length”01 00 06 61 70 70 65 6E 64:“append”01 00 2D 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 3B:“(Ljava/lang/String;)Ljava/lang/StringBuilder;”01 00 08 74 6F 53 74 72 69 6E 67:“toString”01 00 05 77 72 69 74 65:“write”01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56:“(Ljava/lang/String;)V”01 00 05 66 6C 75 73 68:“flush”到此常量池定义结束,接下来:00 21:该类的访问权限标志。