字节码文件初探

程序员编写的Java源文件(.java)经过编译,生成字节码文件(.class)。

Java程序的运行需要JVM(Java虚拟机,Java Virtual Machines)支持。JVM是一个软件,安装在操作系统中,为字节码文件提供运行环境。

Java官方提供了针对不同平台的JVM软件(比如JVM  for Linux, JVM for Windows等),只要是标准的字节码文件,就可以在不同的JVM上运行且运行效果相同,这就是一次编程到处使用(也是Java程序的一个明显优点)。

而其它语言,如C语言的源文件会直接生成可执行文件,可以直接在操作系统中运行。

对于Java源文件经过编译生成的字节码文件如何被只认识0和1的电脑识别并运行,非常好奇,经过几次学习,终于对字节码的规范有了初步了解。

后面会以每个程序员的第一个程序HelloWorld(加上简单的变量)为例,尝试分析下字节码文件。

HelloWorld的源码:

package day02;

public class HelloWorld {

	public static void main(String[] args) {
		String str = "Hello World!";
		System.out.println(str);

	}

}

编译器使用的是JDK 1.8:

打开字节码文件(我使用EditPlus打开,中间会让选择encoding,使用下图所示”Hex viewer”即可)

提示Failed to open document,但点击确定后可正确打开字节码文件。

字节码打开如下图。

红色框内的部分就是HelloWorld.class的内容,其它部分是EditPlus自动生成的:红色框左边部分代表行号,右侧部分是二进制码对应的字符(utf-8编码)

要明白 HelloWorld.java 和 HelloWorld.class 文件是如何对应的,我们必须对 JVM 的字节码规范有所了解。字节码文件的结构非常紧凑,没有任何冗余的信息,连分隔符都没有,它采用的是固定的文件结构和数据类型来实现对内容的分割的。字节码中包括两种数据类型:无符号数和表。无符号数又包括 u1,u2,u4,u8四种,分别代表1个字节、2个字节、4个字节和8个字节。而表结构则是由无符号数据组成的。

待续

时间: 2024-10-11 13:58:22

字节码文件初探的相关文章

java中三种方式获得类的字节码文件对象

package get_class_method; public class ReflectDemo { /** * @param args */ public static void main(String[] args) { getClassObject1(); getClassObject2(); getClassObject3(); } public static void getClassObject1(){ Person p = new Person(); System.out.pr

java 字节码文件详解

每一个class字节码文件都唯一对应一个类或接口,class文件中记录中类或接口的基本信息,但反之不成立,不是每一个类或接口都有一个唯一对应的字节码文件,首先类或接口的字节码可以不以文件的方式存储,可以直接从内存中生成字节码,而不产生.class文件,动态代理的原理就是直接内存中生成字节码流,根据加载字节码流进行类加载操作,类实例化,生成代理对象. 字节码文件记录的信息:魔术,class文件主次版本,常量池数量及常量池表,类或接口的访问标志,类索引,超类索引,接口数量及接口表,字段数量及字段表,

Android-Java-synchronized静态方法&字节码文件对象

上一篇博客 Android-Java-同步方法-synchronized,中讲解了普通方法加入synchronized修饰符,此synchronized的同步锁是this,还介绍方法的封装性,这篇博客就不讲方法的封装性了 先看一个 静态方法加入修饰符synchronized(案例) package android.java.thread12; /** * 售票业务 */ class Booking { /** * 模拟票的总算 10张票 */ private static int ticket

字节码文件的分析

//环境的搭建: 1.创建一个类并编译它 2.使用java命令:javap -c -verbose build/classes/java/main/com/yang/jvm/Test.class 将16进制的字节码文件转成可视化的文件内容如下: 具体内容如下: Classfile /F:/jvmdemo/build/classes/java/main/com/yang/jvm/Test.class Last modified 2019-10-17; size 573 bytes MD5 chec

JAVA字节码文件之第二篇(常量池)

一.常量池的内容 一个java类中定义的很多信息都是由常量池来维护和描述的,可以将常量池看作是class文件的资源仓库,比如java类中定义的方法与变量信息.常量池中主要存储两类常量:字面量(文本字符串,final的常量)与符号引用(类和接口的全限定名,字段的名称和描述符,方法的名称和描述符 一.常量池的结构 二.常量池的分析 常量池(也称常量表):主版本号之后就是常量池的开始位置:java类所对应的常量池主要由常量池数量和常量池数组两部分组成,常量池数量是主版本号之后的两个字节:常量池数组在常

java中反射机制通过字节码文件对象获取字段和函数的方法

pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField("age");//因为age成员变量是私有的,所以会产生NoSuchFieldException异常 Field ageField = pclass.getDeclaredField("age");//获得该对象反映此 Class 对象所表示的类或接口的指定已声明字段 Obje

【java】查看Java字节码文件内容的方法+使用javap找不到类 解决方法

研究synchronized底层实现,涉及到查看java字节码的需要 前提是,你的PC已经成功安装了JDK并别配置了环境变量. ==========查看方法========= 一.javap查看简约字节码方式 1.准备一个java文件 例如,文件所在目录在此处 Student.java文件内容如下: package com.sxd.sweeping.test.synchron; public class Student implements Runnable{ static int age; p

如何将源码文件编译成字节码文件

[[email protected] ~]# cat 1.py # 要编译的源码文件 #!/usr/bin/python print 'Hello World' [[email protected] ~]# cat 2.py # 将 1.py 编译成字节代码 #!/usr/bin/python import py_compile py_compile.compile('1.py') [[email protected] ~]# python 2.py [[email protected] ~]#

[C/C++] 各种C/C++编译器对UTF-8源码文件的兼容性测试(VC、GCC、BCB)

在不同平台上开发C/C++程序时,为了避免源码文件乱码,得采用UTF-8编码来存储源码文件.但是很多编译器对UTF-8源码文件兼容性不佳,于是我做了一些测试,分析了最佳保存方案. 一.测试程序 为了测试编译器对UTF-8源码文件兼容性,我编写了这样的一个测试程序—— //#if _MSC_VER >= 1600 // VC2010 //#pragma execution_character_set("utf-8") //#endif #include <stdio.h>