热门标签 | 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"```



推荐阅读
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社区 版权所有