举例详细说明class文件结构
- 格式:doc
- 大小:127.50 KB
- 文档页数:9
类文件结构的组成类文件是一种用于将相关代码组织在一起的软件开发工具。
它可以包含类、接口、模块、函数等相关元素。
类文件通常用于面向对象的编程语言中,如Java、C++、Python等。
以下是类文件结构的一般组成部分:1. 包声明(Package Declaration):代码所属的包命名空间声明,用于将代码组织成不同的逻辑单元,方便模块化和重用。
2. 导入语句(Import Statements):引用其他类或模块的语句,用于扩展当前文件的功能。
通过导入其他文件,可以使用其定义的类、函数等。
有时,为了简化代码,可以使用通配符导入。
3. 类声明(Class Declaration):类是类文件的核心元素,用于定义一个具有一组属性和方法的对象。
类包含类名、继承关系、成员变量和成员函数等。
4. 属性或成员变量(Properties or Member Variables):类中的属性或成员变量是描述对象状态的变量,通常具有特定的类型和访问修饰符。
它们可以是基本数据类型(如整数、浮点数、布尔值等),也可以是类的对象。
5. 构造函数(Constructor):构造函数是在创建对象时调用的特殊函数,用于初始化类的属性。
构造函数可以具有不同的参数和重载,以满足不同的需求。
6. 成员函数或方法(Methods or Member Functions):成员函数是类内定义的函数,用于执行一些特定的操作。
方法可以访问和操作类的属性,并接受参数和返回值。
方法可以具有不同的访问修饰符,如公有、私有和受保护。
7. 静态成员(Static Members):静态成员是与类关联的成员,不依赖于类的实例。
静态成员可以是静态属性或静态方法。
静态属性在所有类的实例之间共享,而静态方法不需要实例化即可调用。
8. 内部类(Inner Classes):内部类是在类内部定义的类,可用于将类组织成更小的逻辑单元。
它可以用于封装、继承和实现接口等。
Class的基本语法简介类的由来JavaScript 语⾔中,⽣成实例对象的传统⽅法是通过构造函数。
下⾯是⼀个例⼦。
function Point(x, y) {this.x = x;this.y = y;}Point.prototype.toString = function () {return '(' + this.x + ', ' + this.y + ')';};var p = new Point(1, 2);上⾯这种写法跟传统的⾯向对象语⾔(⽐如 C++ 和 Java)差异很⼤,很容易让新学习这门语⾔的程序员感到困惑。
ES6 提供了更接近传统语⾔的写法,引⼊了 Class(类)这个概念,作为对象的模板。
通过class关键字,可以定义类。
基本上,ES6 的class可以看作只是⼀个语法糖,它的绝⼤部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像⾯向对象编程的语法⽽已。
上⾯的代码⽤ ES6 的class改写,就是下⾯这样。
class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return '(' + this.x + ', ' + this.y + ')';}}上⾯代码定义了⼀个“类”,可以看到⾥⾯有⼀个constructor⽅法,这就是构造⽅法,⽽this关键字则代表实例对象。
也就是说,ES5 的构造函数Point,对应 ES6 的Point类的构造⽅法。
Point类除了构造⽅法,还定义了⼀个toString⽅法。
注意,定义“类”的⽅法的时候,前⾯不需要加上function这个关键字,直接把函数定义放进去了就可以了。
另外,⽅法之间不需要逗号分隔,加了会报错。
ES6 的类,完全可以看作构造函数的另⼀种写法。
peclass的书写格式一、什么是peclass?peclass是一种常用于Windows可执行文件(PE文件)的格式规范。
PE文件是Windows操作系统下的可执行文件,包括.exe和.dll等文件类型。
peclass定义了PE文件的结构和组织方式,规定了PE文件各个部分的格式和内容,使得不同的PE 文件能够被系统正确解析和执行。
二、peclass的结构PE文件由多个部分组成,包括PE头、节表、导出表、导入表、资源表等。
peclass规定了每个部分的结构和内容,并规定了它们在PE文件中的排列方式。
2.1 PE头PE头是PE文件的入口,包含了文件的基本信息,如文件类型、目标机器类型、程序入口点等。
PE头的结构由peclass定义,并且在文件的起始位置处。
2.2 节表节表描述了PE文件中的各个节(section),每个节对应一段内存空间,包含可执行代码、数据、资源等。
peclass定义了节表的格式和内容,使得系统能够正确加载和执行PE文件中的代码和数据。
2.3 导出表导出表用于描述PE文件中的函数和变量,以供其他程序使用。
peclass规定了导出表的结构和内容,使得其他程序能够正确引用和调用PE文件中的函数和变量。
2.4 导入表导入表用于描述PE文件中依赖的其他函数和变量,以供自身程序使用。
peclass 规定了导入表的格式和内容,使得PE文件能够正确加载和调用其他函数和变量。
2.5 资源表资源表描述了PE文件中的资源,如图标、位图、字符串等。
peclass定义了资源表的结构和内容,使得PE文件能够正确加载和显示各种资源。
三、peclass的书写格式要求为了确保PE文件的正确解析和执行,peclass对PE文件的书写格式有一定要求。
以下是peclass的书写格式要求:3.1 对齐需求PE文件的各个部分需要按照一定的对齐方式进行排列,在文件对齐和内存对齐方面有不同的要求。
peclass规定了对齐的方式和取值范围,以保证文件的正确性和性能。
java程序代码的结构Java是一种面向对象的编程语言,它的代码结构非常重要,它决定了程序的可读性、可维护性以及可扩展性。
一个良好的代码结构能够使程序更易于理解、调试和修改,同时也能提高开发效率。
在本文中,我将介绍Java程序代码的基本结构,以帮助你写出高质量的Java代码。
Java程序的基本结构是由包(package)、引入(import)、类(class)和方法(method)组成的。
下面我将详细介绍每个部分的作用和规范。
1. 包(package)包是用于管理和组织Java文件的一种方式。
它提供了命名空间和访问控制的功能。
一个包通常对应一个文件夹,包名和文件夹的结构相对应。
包名的命名规范是全部小写,并以逆序的域名(如com.example.mypackage)来命名。
例如,如果你要编写一个名为"HelloWorld"的程序,你可以将它放在"com.example.helloworld"这个包中。
2. 引入(import)在Java中,我们可以使用import语句来引入其他包中的类或接口。
通过引入,我们可以直接使用这些类或接口,而无需每次都写全限定名。
引入语句通常写在文件的开头,位于package语句之后。
例如,如果你想在程序中使用java.util包中的ArrayList类,你可以写入import语句:import java.util.ArrayList;3. 类(class)类是Java程序的基本组成单位。
一个Java文件中只能有一个公开的类,且类名必须与文件名相同。
类用来定义对象的行为和状态。
一个类通常包含字段(variables)和方法(methods)。
字段用于存储对象的状态,而方法用于定义对象的行为。
一个类的定义遵循以下语法:public class ClassName {// 字段声明// 方法声明}例如,下面是一个名为"Person"的类的定义:```public class Person {private String name;private int age;public Person(String name, int age) { = name;this.age = age;}public void sayHello() {System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");}}```4. 方法(method)方法是用于封装具体行为的代码块。
c++中class的用法一、概述在 C++ 中,class 是用于定义类(class)的关键字。
类是一种抽象的数据类型,它描述了一个数据结构以及该结构上执行的操作。
类具有数据成员(即属性和变量)和方法(即函数)。
通过类,我们可以组织相关的数据和函数,并实现对这些数据的操作。
二、class 的定义定义一个类的一般语法如下:```c++class 类名 {数据成员;方法名函数名();方法名函数名(参数列表);...};```其中,类名是自定义的名称,数据成员和方法名是类的组成部分。
方法名后的括号内可以包含一个或多个参数,用于定义方法的输入和输出。
括号后面的分号表示方法定义的结束。
三、类的成员1. 数据成员:类中的数据成员也被称为类的属性,它们可以是基本数据类型、结构体、联合体等。
数据成员在类对象创建时被初始化。
2. 方法成员:类中的方法成员也被称为类的函数,它们用于操作类的数据成员。
方法可以是构造器(构造函数)和析构器(析构函数),以及其他自定义函数。
方法可以在类对象上调用。
四、类的对象类可以用来创建对象(对象是类的实例),对象具有类的属性和方法。
通过对象,我们可以访问其属性和调用其方法。
对象创建时,构造函数会被调用以初始化对象的属性;五、类的继承C++ 支持类的继承,通过继承,一个类可以获得另一个类的属性和方法。
继承可以使用关键字 "继承基类名::",子类将自动继承基类的数据成员和方法。
六、类的其他特性除了基本的类定义和对象创建,C++ 还提供了其他一些有用的类特性,如:1. 嵌套类:可以在类内部定义另一个类,通常用于组织代码。
2. 友元函数和友元类:可以定义一个函数或类,使其能够访问类的私有和保护成员。
3. 虚函数和纯虚函数:虚函数用于实现多态,纯虚函数是虚函数的特例,表示基类需要实现但没有实现的方法。
4. 枚举和类型定义:可以将常量值定义为枚举类型或类型别名,方便代码组织和阅读。
Java语⾔中的Class类基本概念在Object类中定义了以下的⽅法,此⽅法将被所有⼦类继承public final Class getClass()这个⽅法的返回值类型是⼀个Class类,此类是Java反射的源头,是实际上所谓反射从程序的运⾏结果来看也很好理解,即:可以通过对象反射求出类的名称。
对象照镜⼦后可以得到的信息:某个类的属性、⽅法和构造器、某个类到底实现了哪些接⼝。
对于每个类⽽⾔,JRE都为其保留⼀个不变的Class类型的对象。
⼀个Class对象包含了特定某个结构(class、interface、enum、annotation、primitive type、void)的有关信息。
Class本⾝也是⼀个类Class对象只能由系统建⽴对象⼀个加载的类在JVM中只会有⼀个Class实例⼀个Class对象对应的是⼀个加载到JVM中的⼀个.class⽂件每个类的实例都会记得⾃⼰是由哪个Class实例所⽣成通过Class可以完整地得到⼀个类中的所有被加载结构Class类是Reflection的根源,针对任何你想动态加载、运⾏的类,唯有先获得相应的Class对象。
Java中拥有Class对象的类型在Java语⾔中,⼀切皆是对象。
⽽对象主要分为两种,⼀种是普通类创建的实例对象,⼀种是Class类对象。
每个类运⾏时的类型信息就是通过Class对象表⽰的,这个对象包含了与类有关的信息。
其实Java中的实例对象就是通过Class对象来创建的,Java使⽤Class对象执⾏其RTTI(运⾏时类型识别,Run-Time Type Identification),多态是基于RTTI实现的。
那么在Java中哪些类型可以有Class对象呢?class:外部类、成员(成员内部类、静态内部类)、局部内部类、匿名内部类interface:接⼝[]:数组enum:枚举annotation:注解@interfaceprimitive type:基本数据类型void我们⽤代码演⽰⼀下,这些类型的Class对象都是什么?Class c1 = Object.class; // 类Class c2 = Comparable.class; // 接⼝Class c3 = String[].class; // ⼀维数组Class c4 = int[][].class; // ⼆维数组Class c5 = Override.class; // 注解Class c6 = ElementType.class; // 枚举Class c7 = Integer.class; // 基本数据类型(包装类)Class c10 = int.class; // 基本数据类型Class c8 = void.class; // 空类型Class c9 = Class.class; // ClassSystem.out.println(c1); // class ng.ObjectSystem.out.println(c2); // interface parableSystem.out.println(c3); // class [ng.String;System.out.println(c4); // class [[ISystem.out.println(c5); // interface ng.OverrideSystem.out.println(c6); // class ng.annotation.ElementTypeSystem.out.println(c7); // class ng.IntegerSystem.out.println(c10);// intSystem.out.println(c8); // voidSystem.out.println(c9); // class ng.Classint[] a = new int[10];int[] b = new int[100];/*对于数组,只要元素类型与维度⼀样,就是同⼀个Class对象*/System.out.println(a.getClass()); //class [ISystem.out.println(b.getClass()); //class [ISystem.out.println(b.getClass().hashCode()); //1735600054System.out.println(a.getClass().hashCode()); //1735600054每⼀个类都有⼀个Class对象,每当编译⼀个新类就产⽣⼀个Class对象,更准确的来说,是被保存在⼀个同名的.class⽂件中。
class的用法和定义
Class 是一种创建可产生具有相同属性和方法的对象的方法,可以理解为一个对象的模板。
通过定义一个类,可以创建多个具有相同属性和方法的对象。
Class 的定义可以包括以下几个部分:
1. 类名:类名是用来标识一个类的名称,通常使用驼峰命名法(每个单词首字母大写),例如:MyClass。
2. 属性(成员变量):属性是类的状态或特征,可以看作是类中的变量。
它们定义了类的对象的特征。
3. 方法(成员函数):方法是类中定义的函数,用于操作类的对象。
它们定义了类的对象可以进行的操作。
下面是一个简单的示例,展示了如何定义一个类和使用它:
```python
class Person:
def __init__(self, name, age):
= name
self.age = age
def say_hello(self):
print("Hello, my name is", )
print("I am", self.age, "years old")
# 创建一个Person对象
p1 = Person("Alice", 25)
# 调用对象的方法
p1.say_hello()
```
在上面的示例中,我们定义了一个名为Person的类,它有两个属性name和age,并且有一个方法say_hello()。
通过调用类的构造函数`__init__`,我们可以创建Person类的一个对象p1,并通过调用say_hello()方法来输出对象的属性。
class的声明方法Class的声明方法在编程语言中,class是一种用来定义对象的模板或蓝图的语法结构。
它描述了对象的属性和方法。
在本篇文章中,我将为大家介绍几种常见的class声明方法及其使用。
一、Class的基本语法在大部分编程语言中,class的基本语法通常包含以下几个关键字:class、类名、属性、方法等。
class 类名 {// 属性属性1;属性2;...// 方法方法1() {// 方法体}方法2() {// 方法体}...}二、Class的属性属性是class中用来描述对象特征的变量。
在class的声明方法中,我们可以为对象定义不同类型的属性,例如字符串、整数、布尔值等。
属性可以是公共的(public),也可以是私有的(private)。
class Person {// 公共属性public name;public age;// 私有属性private gender;}三、Class的方法方法是class中定义的函数,用于描述对象的行为。
方法可以访问对象的属性,并执行一系列操作。
在class的声明方法中,可以定义多个方法,以实现不同的功能。
class Calculator {// 加法方法public add(num1, num2) {return num1 + num2;}// 减法方法public subtract(num1, num2) {return num1 - num2;}}四、Class的构造函数构造函数是class中的一种特殊方法,用于创建和初始化对象。
在创建对象时,构造函数会自动调用,并可以接收参数来初始化对象的属性。
class Circle {// 构造函数constructor(radius) {this.radius = radius;}// 计算圆的面积public calculateArea() {return Math.PI * this.radius * this.radius;}}五、Class的继承继承是面向对象编程中一种重要的概念,它允许我们基于已有的class创建新的class,并继承已有class的属性和方法。
class,classloder,dex详解class与dex⽂件什么是class⽂件class⽂件是⼀种能够被JVM识别,加载并且执⾏的⽂件格式。
class⽂件的作⽤class⽂件的作⽤是记录⼀个类⽂件的所有信息。
例如记住了当前类的引⽤this、⽗类super等等。
class⽂件记录的信息往往⽐java⽂件多。
class⽂件的结构8位字节的⼆进制流⽂件各个数据紧密排列,⽆间隙,减少了⽂件体积,加快加载速度每个类或者接⼝单独占据⼀个class⽂件,每个类单独管理,没有交叉class⽂件的弊端内存占⽤⼤,不适合于移动端堆栈的加载模式导致加载速度慢⽂件IO操作多,类查找慢什么是dex⽂件能够被DVM或者Art虚拟机执⾏并且加载的⽂件格式。
dex⽂件的作⽤dex⽂件的作⽤是记录整个⼯程(通常是⼀个Android⼯程)的所有类⽂件的信息。
dex⽂件的结构8位字节的⼆进制流⽂件各个数据紧密排列,⽆间隙,减少了⽂件体积,加快加载速度整个⼯程的类信息都存放在⼀个dex⽂件中(不考虑dex分包的情况下)class⽂件与dex⽂件的⽐较本质上都是⼀样的,都是⼆进制流⽂件格式,dex⽂件是从class⽂件演变⽽来的class⽂件存在冗余信息,dex⽂件则去掉了冗余,并且整合了整个⼯程的类信息。
结构对⽐图如下:类加载机制是做热修复以及插件化的很重要的理论基础。
Java中的ClassLoader回顾如下图所⽰:ClassLoader的特性ClassLoader的主要特性是双亲委托机制,即加载⼀个类的时候,先判断已经存在的类是否被加载过,如果没有,先去委托⽗亲去加载。
如果⽗亲都没有加载成功的话,那么最终由⾃⼰加载。
最终这个类最终没有合适的CLassLoader加载,那么就会抛出异常,相关的ClassLoader源码如下:protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{// 先判断这个类是否已经被加载过Class c = findLoadedClass(name);if (c == null) {// 如果没有被加载过,那么委托⽗亲去加载long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}// 如果⽗亲没有加载,那么最终由⾃⼰(实现类)负责加载if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the stats}}return c;}其中CLassLoader的findClass⽅法是空实现,需要⾃⼰继承然后实现:protected Class<?> findClass(String name) throws ClassNotFoundException {throw new ClassNotFoundException(name);}这种双亲委托机制有两种好处:1. 实现类加载的共享功能,提升类加载的效率。
class名词解释Class(英文类)是计算机编程中常用的概念之一,用于表示具有共同属性和行为的对象的定义。
它是面向对象编程(Object-Oriented Programming)中的重要概念之一,通过创建类的实例(对象),可以方便地管理和操作相关数据和函数。
一、类与对象的关系在面向对象编程中,类是对象的模板,而对象是类的实例。
类描述了对象具有的属性和行为,是创建和使用对象的重要依据。
举个简单的例子,我们可以用“汽车”来形容一个类,而一辆具体的汽车就是该类的一个实例。
通过类,我们可以定义汽车具有的属性(如颜色、品牌、型号)以及行为(如启动、加速、刹车)。
而对象则是具体的一辆汽车,它拥有类定义的属性和行为,并能根据需要进行相应的操作。
二、类的组成类由属性和方法组成。
属性是类的特征,描述了该类的状态或特性。
方法则描述了类的行为,可以对属性进行操作和修改。
继续以汽车为例,汽车类的属性可以包括颜色、品牌和型号,而方法可以包括启动、加速、刹车、换挡等。
在面向对象编程中,类可以继承和派生。
继承是指一个类可以继承另一个类的属性和方法,从而避免重复编写相似代码。
派生是指从一个基类派生出一个新的类,通过添加或修改属性和方法,使其具有更特定的功能。
例如,在汽车类的基础上,可以派生出轿车类、卡车类和客车类,它们分别具有各自独特的属性和方法,同时也继承了汽车类的共同特征。
三、类的实例化和使用类的实例化是指创建类的对象。
通过实例化,可以根据类的模板来创建具体的对象,并对其进行操作和管理。
在许多编程语言中,通过调用类的构造函数来创建对象。
构造函数是类中一种特殊的方法,用于初始化对象的属性和状态。
以汽车类为例,可以通过调用构造函数来创建一辆具体的汽车对象,并指定其属性值。
创建对象后,可以通过对象名和点操作符来访问和修改对象的属性和调用方法。
例如,可以使用car.color的方式获取汽车对象的颜色属性,使用car.start()的方式来启动汽车对象。
我们先来给出一个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:该类的访问权限标志。