关于class:解析Class文件示例

筹备class文件是Java虚拟机惟一能够辨认的文件,依据Class文件咱们能够实现一个程序的运行,本节文章是自己解析一个根本Class文件的全过程,记录在此,心愿能提供给正在后退路上的同学作为辅助作用,上面是咱们要解析Class文件必要条件。 代码以下是一个简略的Java类,一个公有变量,一个公开办法。 public class TestClass { private int a; public int increment() { return a + 1; }}将这个类编译为Class文件 筹备文本编辑器自己应用Sublime Text关上咱们编译后的Class文件,次要目标是对照《Java虚拟机标准》中的Class文件的数据结构,上面是Sublime Text下载的网址。 Sublime Text 应用Sumlime关上Clas文件 《Java虚拟机标准》咱们须要依照Java虚拟机标准中的数据结构,进行Class文件的十六进制码进行解析,所以这里须要依照官网,进行解析,以下是PDF在线链接,本节应用Java8版本。Java虚拟机标准1.8 关上《Java虚拟机标准》 解析咱们须要晓得一个Class文件由哪些数据结构组成,并排列进去,一项数据占几个字节,这些咱们都要晓得。咱们首先须要记录,这个Class文件的大体构造,Class文件的数据结构及程序都是须要严格依照《Java虚拟机标准》生成的,找到《Java虚拟机标准》中的 "The Class File Format (Class文件格式)"中的Class构造项。 须要解释的是,这个ClassFile数据结构中的U2、u4别离代表两个字节、四个字节,其对应的左边的英文项,代表着其数据的常量项,Class文件是肯定依照这个构造进行构件的,《Java虚拟机标准》中也阐明了每一项的形容,自己联合官网整顿如下: 这个是自己整顿的Class文件的数据结构,有且只有这16项,具体的每一项,本文稍后都有解释。其实Class文件并不简单,只是Class中的援用比拟多,例如constant_pool_info中,这是一个常量池,池中记录着类、办法、字面量等描述符,是互相援用的形式。 javap查看class文件具体构造应用javap查看文件构造,次要是为了供咱们于Class二进制形式进行比对时的一个参照物,以阐明咱们解读class文件时得出的论断是正确的。其余咱们须要确定咱们常量池中的程序以及所对应的常量池名。 javap -v TestClass.class输入后果 依据javap所输入的数据结构,咱们失去了大抵的数据结构,剩下的咱们须要自行解析,并比对class中的十六进制数进行填写。这里采纳yaml文本格式进行填充,yaml格局能很直观的展现出一个对象的数据结构,并且采纳这种形式也能够很间接的将解析的值带入。针对咱们要解析的class文件,其中____是咱们要填充的数据,并且也进行了简略的正文阐明字段的含意及所占用的字节。构造如下: class: #魔数 u4 magic-number: ____ #小版本号 u2 minor-version: ____ #大版本号 u2 major-version: ____ #常量池 constant-pool: #常量池总数 u2 count: ____ #常量池(数组) constants: ____ #拜访标记 u2 access_flags: ____ #以后类 u2 this_class: ____ #父类 u2 super_class: ____ #接口 interface: # u2 count: ____ interfaces: #字段 field: # u2 count: ____ fields: ____ #办法 method: # u2 count: ____ methods: ____ #属性 attributes: #u2 count: ____ attributes: ____有了大抵的构造,咱们就能够开始解析之路啦!! ...

April 21, 2023 · 1 min · jiezi

关于class:初始JavaClass文件

class文件的由来Java类文件是蕴含可在Java 虚拟机 (JVM)上执行的Java 字节码的文件(具备.class 文件扩展名)。Java 类文件通常由Java 编译器依据蕴含 Java 类的 Java 编程语言源文件(.java文件)生成(或者,其余JVM 语言也可用于创立类文件)。如果一个源文件有多个类,则每个类都被编译成一个独自的类文件。JVM 可用于许多平台,在一个平台上编译的类文件将在另一个平台的 JVM 上执行。这使得 Java 应用程序与平台无关。 class文件的组成Java类文件构造有10个根本局部 魔数:0XCAFEBABEMinor Version AND Major Version:类文件的主要版本和次要版本constant_pool: 常量池,类的常量池access_flags: 拜访标记,类是否是抽象类、动态类等this_class:以后类的名称super_class:超类的名称interfaces:类中的任何接口fields:类中的任何字段methods:类中的任何办法attributes:类中的任何属性(例如源文件的名称等)魔数类文件是由4字节的十六进制标识的,在class文件中为:CAFE BABE。 这个标识的由来是James Gosing在谈到帕洛阿尔托的一家餐厅时解释了这个神奇数字的历史: "咱们过来常去一个叫圣米迦勒巷的中央吃午饭。依据当地传说,在光明的过来,Grateful Dead(1964年组建的一只美国乐队)在他们成名之前已经在那里上演。这是一个十分时尚的中央,相对是一个 Grateful Dead Kinda Place,Jerry(乐队的主唱)死后,他们甚至建了一个佛教格调的小神社,咱们以前去那里的时候,咱们称这个中央为 Cafe Dead。沿线的某个中央留神到这是一个 HEX 数字。我正在从新批改一些文件格式代码,须要一些神奇的数字:一个用于长久对象文件,一个用于类。我应用 CAFEDEAD 作为对象文件格式,并在grepping对于适宜“CAFE”(这仿佛是一个很好的主题)之后的 4 个字符的十六进制单词,我偶尔发现了 BABE 并决定应用它。在那个时候,除了历史的垃圾桶之外,它仿佛并没有什么特地的重要或注定要去任何中央。所以 CAFEBABE 成为类文件格式,而 CAFEDEAD 成为长久对象格局。然而长久对象工具隐没了,随之而来的是 CAFEDEAD 的应用——它最终被RMI取代。" 总体布局因为类文件蕴含可变大小的我的项目并且不蕴含嵌入式文件偏移量,所以它通常是按程序解析的,从第一个字节到最初。在最低级别,文件格式依据一些根本数据类型进行形容: U1: 一个无符号的8位整数U2: 无符号16 位整数,大端字节程序u4: 一个无符号的32 位整数,大端字节程序table: 某种类型的可变长度我的项目的数组。表中的项目数由后面的计数编号标识(计数为 u2),但表的字节大小只能通过查看其每个我的项目来确定。而后依据上下文将其中一些根本类型从新解释为更高级别的值(例如字符串或浮点数)。没有强制执行字对齐,因而从未应用过填充字节。类文件的整体布局如下表所示。待更新。。。 扩大常识Grateful Dead

April 14, 2023 · 1 min · jiezi

关于class:探索-Class-底层原理

ECMAScript6 实现了 class ,实际上它是一个语法糖,然而它的呈现能使 JS 编码更清晰,更靠近 面向对象编程。 实现原理首先咱们来看 ES6 中 class 的实现和 ES5 构造函数的实现,两者相比拟不难看出 constructor 其实就是构造方法,指向 ES5 的构造函数,那么 class 自身指向的是构造函数,换言之底层仍旧是构造函数。 ES6class Person { constructor(name, age) { this.name = name; this.age = age; } static run() { console.log("run"); } say() { console.log("hello!"); }}ES5function Person(name, age) { this.name = name; this.age = age;}Person.prototype.say = function () { console.log("hello!");};Person.run = function () { console.log("run");};babel 编译剖析通过 babel 编译器将 ES6 代码 转换成 ES5 代码之后(代码转换能够试用 babel 官网在线工具),可失去这两个要害函数 _defineProperties 和 _createClass,当初咱们来一一解析阐明。 ...

May 12, 2021 · 3 min · jiezi