热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java编译过程详解:生成字节码文件的技术解析与应用20201012

本文深入解析了Java编译过程,重点探讨了从源代码到字节码文件的转换机制。通过具体示例,如`Hello.java`的编译与反编译过程,详细介绍了`javap-verbose`命令的使用方法及其在字节码分析中的重要作用。此外,文章还讨论了字节码文件的结构特点及其在不同应用场景中的实际应用,为开发者提供了宝贵的参考。

javap -verbose Hello

Java代码:

public class Hello {

public static void main(String[] args) {

System.out.println("hello world");

}

}

生成的字节码如下:

```Classfile /Users/jessen/learning/JAVA-000/Week_01/demo1/Hello.class

Last modified 2020-10-12; size 415 bytes

MD5 checksum f78738196756e74f31907b064c1ee653

Compiled from "Hello.java"

public class Hello

minor version: 0

major version: 52

flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Methodref          #6.#15        // java/lang/Object."":()V

#2 = Fieldref          #16.#17        // java/lang/System.out:Ljava/io/PrintStream;

#3 = String            #18            // hello world

#4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V

#5 = Class              #21            // Hello

#6 = Class              #22            // java/lang/Object

#7 = Utf8

#8 = Utf8              ()V

#9 = Utf8              Code

#10 = Utf8              LineNumberTable

#11 = Utf8              main

#12 = Utf8              ([Ljava/lang/String;)V

#13 = Utf8              SourceFile

#14 = Utf8              Hello.java

#15 = NameAndType        #7:#8          // "":()V

#16 = Class              #23            // java/lang/System

#17 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;

#18 = Utf8              hello world

#19 = Class              #26            // java/io/PrintStream

#20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V

#21 = Utf8              Hello

#22 = Utf8              java/lang/Object

#23 = Utf8              java/lang/System

#24 = Utf8              out

#25 = Utf8              Ljava/io/PrintStream;

#26 = Utf8              java/io/PrintStream

#27 = Utf8              println

#28 = Utf8              (Ljava/lang/String;)V

{

public Hello();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #1                  // Method java/lang/Object."":()V

4: return

LineNumberTable:

line 2: 0

public static void main(java.lang.String[]);

descriptor: ([Ljava/lang/String;)V

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=2, locals=1, args_size=1

0: getstatic    #2                  // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc          #3                  // String hello world

5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: return

LineNumberTable:

line 4: 0

line 5: 8

}

SourceFile: "Hello.java"```



推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
author-avatar
朱甜520_322
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有