Java-初识 .class 文件

news2024/11/15 11:38:43

一、概述

class文件全名称为 Java class 文件,主要在平台无关性和网络移动性方面使 Java 更适合网络。该文件打破了 C 或者 C++ 等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件。

通常情况下,一个平台上的二进制可执行文件不能在其他平台上工作。而 class文件是可以运行在任何支持 Java虚拟机 的硬件平台和操作系统上的二进制文件。

一个典型 Java 程序产生的过程:

在这里插入图片描述

当我们对一个 Java 源程序进行 javac 编译后就会生成 class 文件。

就以 HelloWorld.java 源程序为例:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World ~~");
    }
}

使用 javac 编译

在这里插入图片描述

在 Java 中,JVM 可以理解的代码叫作字节码,也就是 .class 文件,它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,并且保留了解释型语言可移植的特点,而通过即时编译器(JIT)又有编译型语言执行效率高的特点。所以 Java 程序运行时比较高效,同时 Java 通过字节码文件和虚拟机之间的关系,实现了平台无关性,一次编译,各平台都可运行。

值得一提的是,不仅是 Java 源程序可以被编译成 .class 文件,有些语言也可以编译成 .class 文件,而且都可以运行在 JVM 上。

在这里插入图片描述
所以说 JVM 和语言无关,只要符合 .class 文件的规范,都可以运行。

二、打开 Class 文件

  • 方式一:使用文本编辑器打开

我们可以使用一些 文本编辑器 来打开 .class 文件,比如 Nodpad++

在这里插入图片描述

可以看到打开之后显示的内容是一些夹杂着字符的乱码,其实文件中包含的是一些字节序列,但有些字节不能显示为一个字符,所以看起来就是乱码。

我们可以在 Nodpad++ 上下载 HEX-Editor 的插件,就能看到该文件的十六进制内容了(使用Nodepad++工具查看文件的十六进制)

  • 方式二:编写代码读取 class 文件的内容并显示
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;

public class ReadDis {

    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入当前目录下要显示的文件名:");
        String fileName = scanner.next();
        FileInputStream inputStream = new FileInputStream(fileName);
        byte[] data = new byte[inputStream.available()];
        int read = inputStream.read(data);
        inputStream.close();

        System.out.println("文件内容:");

        showASCII(data);
        showHex(data);
    }


    // 显示为ASCII格式
    public static void showASCII(byte[] data) throws UnsupportedEncodingException {
        System.out.println("\r\n\t文件的ASCII内容");
        String ascData = new String(data, "ASCII");
        for (int i = 0; i < ascData.length(); i+=40) {
            int t = i+40;
            if (t>ascData.length()) {
                t=ascData.length();
            }
            String len = ascData.substring(i,t);
            System.out.print(len);
        }
    }

    // 显示为十六进制格式
    public static void showHex(byte[] data) {
        System.out.println("\r\n\t文件的十六进制内容");
        for (int i = 0; i < data.length; i++) {
            String hex = Integer.toHexString(data[i] & 0xFF);
            if (hex.length() < 2) {
                hex = "0" + hex;
            }
            System.out.print(hex + "");
            if ((i+1)%16==0) {
                System.out.println();
            }
        }
    }
}

  • 方式三:在命令行执行 javap -c -s -p HelloWorld.class 命令

在这里插入图片描述

javap 是 JDK 自带的反编译工具,是给 JVM 看的代码。

  • 方式四:使用反编译工具

可以使用一些反编译工具,比如:Q-dir,或者是开发工具,比如:IDEA 等打开 .class,打开之后看到的为反编译内容。

在这里插入图片描述


三、class 文件内容

在官网中有明确的说明文档:https://docs.oracle.com/javase/specs/index.html

在这里插入图片描述

不过是英文的,或者借鉴博客:详解.class文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420439.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试被问到vue的diff算法原理,我不允许你回答不上来

一、是什么 diff 算法是一种通过同层的树节点进行比较的高效算法 其有两个特点&#xff1a; 比较只会在同层级进行, 不会跨层级比较在diff比较的过程中&#xff0c;循环从两边向中间比较 diff 算法在很多场景下都有应用&#xff0c;在 vue 中&#xff0c;作用于虚拟 dom 渲…

nvm实现多版本node自由切换

nvm&#xff0c;全称是node.js version management,可以在多个node版本之间自由切换&#xff01; 1、下载文件 github Releases coreybutler/nvm-windows GitHub 2、安装nvm 注意&#xff1a;安装前必须完全卸载node 彻底从Windows中删除Node.js 1、从卸载程序卸载程序和功…

【性能测试】Jemeter+mysql+CSV+InfluxDB+Granafa数据库性能测试及监控

Jmeter连接Mysql并执行事务 一、下载驱动并加入jmeter 1.mysql驱动下载地址&#xff1a;MySQL :: Download MySQL Connector/J (Archived Versions) 找到对应的驱动下载(版本一定要对应) 2.下载后&#xff0c;解压&#xff0c;找到驱动jar包复制到桌面&#xff1a; 3.把驱动j…

CODOSYS之结构化文本(ST)——中级篇(一)计时器的应用

标准库中常用的计时器有如下四个&#xff08;部分环境还支持高精度计时器如LTON等等&#xff09;&#xff1a; .RTC .TON .TOF .TP 本文将对将对上述四个计时器进行简单的讲解。 .RTC&#xff1a; RunTime 时钟定时器&#xff0c;返回启动时间&#xff0c;当前时间和日…

别搞了 软件测试真卷不动了...

内卷可以说是 2022年最火的一个词了。2023 年刚开始&#xff0c;在很多网站看到很多 软件测试的 2022 年度总结都是&#xff1a;软件测试 越来越卷了&#xff08;手动狗头&#xff09;&#xff0c;2022 年是被卷的一年。前有几百万毕业生虎视眈眈&#xff0c;后有在职人员带头“…

L2-042 老板的作息表(极短代码)

题目&#xff1a; 新浪微博上有人发了某老板的作息时间表&#xff0c;表示其每天 4:30 就起床了。但立刻有眼尖的网友问&#xff1a;这时间表不完整啊&#xff0c;早上九点到下午一点干啥了&#xff1f; 本题就请你编写程序&#xff0c;检查任意一张时间表&#xff0c;找出其中…

企业推广常用的网络推广方法有哪些?

网络推广是指通过互联网向目标用户推广产品、服务或品牌的过程&#xff0c;其主要目的是为了扩大业务范围&#xff0c;提高企业知名度&#xff0c;增加销售额。在当今的数字化时代&#xff0c;网络推广已经成为了企业不可或缺的一部分。本文将介绍一些常见的网络推广方法和途径…

Linux安装中文字体

前言 Lunix默认没有中文字库&#xff0c;很容易导致项目开发时出现中文字符乱码的情况。 1 查看linux已安装字体 fc-list如出现-bash: fc-list: command not found 说明Linux中没有安装字体库&#xff0c;需要先安装字体库 2 Linux安装字体 yum -y install fontconfig执行…

不平衡电网电压下虚拟同步发电机VSG控制策略-实现不平衡电压下控制三相电流平衡

资源地址&#xff1a; 不平衡电网电压下虚拟同步发电机VSG控制策略-实现不平衡电压下控制三相电流平衡-电子商务文档类资源-CSDN文库 主体模型&#xff1a; VSG控制&#xff1b;正负序分离&#xff1b;正负序控制&#xff1b;电压电流双环控制&#xff01;&#xff01;&…

[LCA]最近公共祖先(倍增)

概念引入 祖先 祖先其实很好理解&#xff0c;一个节点的 **父节点 以及 父节点的父节点 以及 父节点的父节点的父……**都是这个节点的祖先 比如说上面的 ddd 节点&#xff0c; bbb 节点和 aaa 节点都是它的祖先 kkk 级祖先 称节点 &#x1d465; 的父节点为 &#x1d465; …

带你走进Flutter 3.7

期待已久的新教程上线啦&#xff01;解锁Flutter开发新姿势&#xff0c;一网打尽Flutter最新与最热技术&#xff0c;点我Get!!! 新年伊始&#xff0c;由 Flutter 3.7 正式版来「打头阵」&#xff01;我们与整个 Flutter 社区们继续在 Flutter 3.7 中优化了框架&#xff0c;包括…

(一)Linux:自由、开放、灵活的操作系统内核

目录 一、Linux的发展史 二、linux的开源 三、目前的现状 四、企业应用现状 五、发行的版本 六、安装与使用 七、利用云服务器配置Linux环境 一、Linux的发展史 Linux是一款由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;开发的操作系统内核&#xff0c;它的发布…

用 logging 模块将信息输出到日志文件

当你要用到一些信息去统计画图&#xff0c; 或者你的输出太长了&#xff0c;出现了那种“折叠”&#xff0c;就是说“内容超过1000行”&#xff0c;结果等下一次进入环境&#xff0c;你只能看到结尾的输出&#xff0c;却看不到开头的输出了&#xff0c; 那么你可以使用 Pytho…

【NLP实战】基于Bert和双向LSTM的情感分类【上篇】

文章目录前言简介数据获取与提取数据清洗读取数据&#xff0c;查看数据清洗训练集观察数据分布去除空数据去除重复数据关于去除停用词关于特殊符号储存清洗后的数据集清洗测试集观察数据分布去除空数据去除重复数据(并储存)清洗验证集观察数据分布去除空行去除重复数据(并储存)…

Go分布式爬虫(二十四)

文章目录24 存储引擎爬取结构化数据step1 从首页获取热门标签信息step2 获取图书列表step3 获取图书详情完整规则存储到MySQL数据抽象数据存储存储引擎实现存储引擎验证dockerdocker-compose使用Navicat查看使用DataGrip查看24 存储引擎 爬虫项目的一个重要的环节就是把最终的…

Mysql逻辑架构和语句执行流程

文章目录1. 逻辑架构剖析1.1 连接管理--连接层1.2 解析与优化--服务层1.3 存储引擎2. SQL语句的执行流程2.1 执行原理2.2 语法顺序1. 逻辑架构剖析 当一个客户端连接mysql服务器执行一条查询语句时&#xff0c;会发生以下处理过程&#xff1a; 1.1 连接管理–连接层 客户端想…

1.半导体基础知识

1.半导体基础知识本征半导体什么是半导体&#xff1f;什么是本征半导体&#xff1f;本征半导体的结构本征半导体中的两种载流子为什么将自然界导电性能中等的半导体材料制成本征半导体杂质半导体N型半导体P型半导体PN结PN结中的扩散运动漂移运动和PN结的形成PN结的单向导电性PN…

Spring中Bean对象的作用域和生命周期详解

Spring作为一个具有众多工具方法的IoC容器&#xff0c;其核心功能就是Bean对象的存储和取出&#xff0c;那么学习Bean对象的作用域和生命周期能让我们更清楚地了解Bean对象在Spring容器中的整个加载过程&#xff01; 一&#xff0c;案例演示&#xff08;Bean对象的修改&#xf…

4.搜索辅助功能

ES 既有基本的搜索功能、又有字段类型的精确搜索、分词匹配、范围搜索、坐标搜索、分页查询等等。 4.1 搜索辅助功能 俗话说“工欲善其事&#xff0c;必先利其器”。在介绍ES提供的各种搜索匹配功能之前&#xff0c;我们先介绍ES提供的各种搜索辅助功能。例如&#xff0c;为优化…

【让你的灵感立刻落地】在线代码运行平台InsCode

文章目录官网地址详解1. 导入项目2. 在线演示、在线修改3. 发布作品参考InsCode 是一个在线代码运行平台&#xff0c;可以在线上运行代码&#xff0c;并且支持多种语言&#xff0c;同时还可以在线修改和提交代码&#xff0c;支持发布和分享项目。InsCode 平台在编写博客、演示项…