Java-初识 .class 文件 待我称王封你为后i 2023-09-30 23:07 4阅读 0赞 ## 一、概述 ## [class文件][class]全名称为 `Java class` 文件,主要在平台无关性和网络移动性方面使 `Java` 更适合网络。该文件打破了 `C` 或者 `C++` 等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件。 通常情况下,一个平台上的二进制可执行文件不能在其他平台上工作。而 `class`文件是可以运行在任何支持 `Java虚拟机` 的硬件平台和操作系统上的二进制文件。 **一个典型 Java 程序产生的过程:** ![在这里插入图片描述][afe1fdc71dec4483b6256dd2c90a3870.png] 当我们对一个 Java 源程序进行 `javac` 编译后就会生成 `class` 文件。 就以 `HelloWorld.java` 源程序为例: public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World ~~"); } } 使用 `javac` 编译 ![在这里插入图片描述][82e76e5d5d674e30bac8f2d86c38c4dd.png] 在 Java 中,JVM 可以理解的代码叫作`字节码`,也就是 `.class` 文件,它不面向任何特定的处理器,只面向`虚拟机`。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,并且保留了解释型语言可移植的特点,而通过即`时编译器(JIT)`又有编译型语言执行效率高的特点。所以 Java 程序运行时比较高效,同时 Java 通过字节码文件和虚拟机之间的关系,实现了平台无关性,一次编译,各平台都可运行。 值得一提的是,不仅是 Java 源程序可以被编译成 `.class` 文件,有些语言也可以编译成 `.class` 文件,而且都可以运行在 JVM 上。 ![在这里插入图片描述][04360c41c28c4c1dbc618a641fedd66d.png] 所以说 `JVM` 和语言无关,只要符合 `.class` 文件的规范,都可以运行。 ## 二、打开 Class 文件 ## * 方式一:使用文本编辑器打开 我们可以使用一些 `文本编辑器` 来打开 `.class` 文件,比如 `Nodpad++` ![在这里插入图片描述][e6f76c3893b94b0b8c46650c21edab81.png] 可以看到打开之后显示的内容是一些夹杂着字符的乱码,其实文件中包含的是一些字节序列,但有些字节不能显示为一个字符,所以看起来就是乱码。 我们可以在 `Nodpad++` 上下载 `HEX-Editor` 的插件,就能看到该文件的`十六进`制内容了([使用Nodepad++工具查看文件的十六进制][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` 命令 ![在这里插入图片描述][ce697fe201e9481481b213ee1103dbac.png] `javap` 是 JDK 自带的反编译工具,是给 JVM 看的代码。 * 方式四:使用反编译工具 可以使用一些反编译工具,比如:`Q-dir`,或者是开发工具,比如:`IDEA` 等打开 `.class`,打开之后看到的为反编译内容。 ![在这里插入图片描述][8463766dd70e4174bea4dad951ab5914.png] -------------------- ## 三、class 文件内容 ## 在官网中有明确的说明文档:[https://docs.oracle.com/javase/specs/index.html][https_docs.oracle.com_javase_specs_index.html] ![在这里插入图片描述][ccd75a52c7304c69b8849f1d2b8d8e5e.png] 不过是英文的,或者借鉴博客:[详解.class文件][.class] [class]: https://baike.baidu.com/item/class%E6%96%87%E4%BB%B6/6740343?fr=aladdin [afe1fdc71dec4483b6256dd2c90a3870.png]: https://img-blog.csdnimg.cn/afe1fdc71dec4483b6256dd2c90a3870.png [82e76e5d5d674e30bac8f2d86c38c4dd.png]: https://img-blog.csdnimg.cn/82e76e5d5d674e30bac8f2d86c38c4dd.png [04360c41c28c4c1dbc618a641fedd66d.png]: https://img-blog.csdnimg.cn/04360c41c28c4c1dbc618a641fedd66d.png [e6f76c3893b94b0b8c46650c21edab81.png]: https://img-blog.csdnimg.cn/e6f76c3893b94b0b8c46650c21edab81.png [Nodepad]: https://blog.csdn.net/Daningliu/article/details/121701259 [ce697fe201e9481481b213ee1103dbac.png]: https://img-blog.csdnimg.cn/ce697fe201e9481481b213ee1103dbac.png [8463766dd70e4174bea4dad951ab5914.png]: https://img-blog.csdnimg.cn/8463766dd70e4174bea4dad951ab5914.png [https_docs.oracle.com_javase_specs_index.html]: https://docs.oracle.com/javase/specs/index.html [ccd75a52c7304c69b8849f1d2b8d8e5e.png]: https://img-blog.csdnimg.cn/ccd75a52c7304c69b8849f1d2b8d8e5e.png [.class]: https://blog.csdn.net/isbn0123/article/details/118642699
相关 初识Java 一、Java语言概述 1.1 Java是什么 > Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义 > 不仅如此,Java还是一个有一 我不是女神ヾ/ 2024年02月21日 11:13/ 0 赞/ 73 阅读
相关 Java-初识 .class 文件 一、概述 [class文件][class]全名称为 `Java class` 文件,主要在平台无关性和网络移动性方面使 `Java` 更适合网络。该文件打破了 `C` 或 待我称王封你为后i/ 2023年09月30日 23:07/ 0 赞/ 5 阅读
相关 初识Java Java简介 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James 不念不忘少年蓝@/ 2023年09月24日 19:53/ 0 赞/ 90 阅读
相关 初识Java Java Java 是一种可以撰写跨平台应用程序的面向对象的程序设计语言,是1995年SUN公司推出的一门高级编程语言,是面向互联网的语言,WEB应用程序首选的语言。 我会带着你远行/ 2022年12月26日 11:25/ 0 赞/ 169 阅读
相关 初识JAVA Java的起源: Java之父:James Gosling 1995年5.23日正式诞生;Java的形象代表图标 :“一杯热气腾腾的咖啡 水深无声/ 2022年08月09日 04:29/ 0 赞/ 377 阅读
相关 初识java > 注:本人最近在复习整理java开发相关的知识,做java开发两年多的时间了,接触了很多东西,最近考虑整理下来供自己也可以供大家参考,希望大家共同进步。博客会不定时更新补充。 末蓝、/ 2022年06月05日 12:17/ 0 赞/ 303 阅读
相关 初识java 新的学期初识Java,在这一周的Java学习中学习到了两种排序的方法:冒泡法和选择法排序 首先说一下冒泡法 例如一组数据5 9 3 1 6从小到大排列 第一轮 骑猪看日落/ 2022年05月28日 04:55/ 0 赞/ 412 阅读
相关 初识Java 今天算是从c++里脱身了,进入了Java程序员的行列,虽然之前对Java没有了解过,但是出于对c++编程的理解,除了刚开始对编辑环境以及对Java的语法不太熟悉 女爷i/ 2022年05月20日 09:57/ 0 赞/ 343 阅读
相关 理解jvm的无关系,初识class文件 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Vvd 野性酷女/ 2022年05月14日 14:42/ 0 赞/ 122 阅读
相关 Java 类机制(1)---- 初识 Class 文章目录 前言 初探 Class Class 与反射 Constructor Metho 悠悠/ 2022年03月21日 04:55/ 0 赞/ 152 阅读
还没有评论,来说两句吧...