一:Java字节代码的组织形式
类文件{
OxCAFEBABE,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域信息数组,方法个数,方法信息数组,属性个数,属性信息数组
}
二:查看方法 --- javap命令
例子:有一个Java类Demo.java
public class Demo { private String str1; private String str2; private int num1; private int num2; public static final String STATIC_DATA = "hello world"; private void sayHello1(){ System.out.println("this is method1..."); } private void sayHello2(){ System.out.println("this is method2..."); } public void sayHello3(){ System.out.println("this is method3..."); } }
通过jdk自带的反编译工具命令 javap 可以查看class文件的字节码信息
D:\>javap -verbose Demo >> Demo.txt
Demo.txt:
Compiled from "Demo.java" public class Demo extends java.lang.Object SourceFile: "Demo.java" minor version: 0 major version: 49 Constant pool: const #1 = class #2; // Demo const #2 = Asciz Demo; const #3 = class #4; // java/lang/Object const #4 = Asciz java/lang/Object; const #5 = Asciz str1; const #6 = Asciz Ljava/lang/String;; const #7 = Asciz str2; const #8 = Asciz num1; const #9 = Asciz I; const #10 = Asciz num2; const #11 = Asciz STATIC_DATA; const #12 = Asciz ConstantValue; const #13 = String #14; // hello world const #14 = Asciz hello world; const #15 = Asciz <init>; const #16 = Asciz ()V; const #17 = Asciz Code; const #18 = Method #3.#19; // java/lang/Object."<init>":()V const #19 = NameAndType #15:#16;// "<init>":()V const #20 = Asciz LineNumberTable; const #21 = Asciz LocalVariableTable; const #22 = Asciz this; const #23 = Asciz LDemo;; const #24 = Asciz sayHello1; const #25 = Field #26.#28; // java/lang/System.out:Ljava/io/PrintStream; const #26 = class #27; // java/lang/System const #27 = Asciz java/lang/System; const #28 = NameAndType #29:#30;// out:Ljava/io/PrintStream; const #29 = Asciz out; const #30 = Asciz Ljava/io/PrintStream;; const #31 = String #32; // this is method1... const #32 = Asciz this is method1...; const #33 = Method #34.#36; // java/io/PrintStream.println:(Ljava/lang/String;)V const #34 = class #35; // java/io/PrintStream const #35 = Asciz java/io/PrintStream; const #36 = NameAndType #37:#38;// println:(Ljava/lang/String;)V const #37 = Asciz println; const #38 = Asciz (Ljava/lang/String;)V; const #39 = Asciz sayHello2; const #40 = String #41; // this is method2... const #41 = Asciz this is method2...; const #42 = Asciz sayHello3; const #43 = String #44; // this is method3... const #44 = Asciz this is method3...; const #45 = Asciz SourceFile; const #46 = Asciz Demo.java; { public static final java.lang.String STATIC_DATA; Constant value: String hello world public Demo(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #18; //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 2: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LDemo; public void sayHello3(); Code: Stack=2, Locals=1, Args_size=1 0: getstatic #25; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #43; //String this is method3... 5: invokevirtual #33; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return LineNumberTable: line 17: 0 line 18: 8 LocalVariableTable: Start Length Slot Name Signature 0 9 0 this LDemo; }
解析:
1.版本号 major version: 49 //java版本 jdk1.6显示的是50, jdk1.5显示的是49,jdk1.4显示的是58 , 高版本能执行低版本的class文件
2.常量池Constant pool
Method:方法
Field:字段
String:字符串
Asciz:签名如<init>由jvm调用,其他是不能够去调用它的
NameAndType:变量名的类型
Class:类
通过字节码,我们可以看到Demo类 继承于java.lang.Object,如果类中没有显式声明构造函数的话,编译器会插入一个缺省无参的构造函数(构造函数在JVM级别是显示成<init>的普通函数)。
三:检测代码的效率问题
学习Java的过程中,都会了解到字符串合并时要用到StringBuffer 来代替String,那下面就来通过Java字节码来验证两种方式的效率性。
例子:一个Java类 TestString.java
<strong>public class TestString { public String testString(String str1, String str2){ return str1 + str2; } public String testStringBuffer(StringBuffer sb, String str){ return sb.append(str).toString(); } } </strong>
javap –c TestString 后字节码信息:
Compiled from "TestString.java" public class TestString extends java.lang.Object{ public TestString(); Code: 0: aload_0 1: invokespecial #8; //Method java/lang/Object."<init>":()V 4: return public java.lang.String testString(java.lang.String, java.lang.String); Code: 0: new #16; //class java/lang/StringBuilder 3: dup 4: aload_1 5: invokestatic #18; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; 8: invokespecial #24; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 11: aload_2 12: invokevirtual #27; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 15: invokevirtual #31; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 18: areturn public java.lang.String testStringBuffer(java.lang.StringBuffer, java.lang.String); Code: 0: aload_1 1: aload_2 2: invokevirtual #40; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer; 5: invokevirtual #45; //Method java/lang/StringBuffer.toString:()Ljava/lang/String; 8: areturn }
从上面编译后的字节码信息可以看出来,方法testString 调用了五个方法:new 、invokestatic 、invokespecial 和两个invokevirtual ; 而testStringBuffer 方法只调用了两个invokevirtual 方法。第一个方法比第二个方法多做了好多工作,其效率当然是要低的。而且我们从java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
可以看出来其实对于String字符串合并,内部还是转化为StringBuilder的方法调用,这是因为String是长度不可变的,所以不如直接采用StringBuilder(与StringBuffer 长度都是可变的,只不过前者是非线程安全,后者是线程安全)进行字符串合并。
原文链接:http://15838341661-139-com.iteye.com/blog/1287866
本文地址http://www.chengxuyuans.com/javabase/33699.html
您还没有登录,请您登录后再发表评论
标题中的“class运行器v6”是一个用于执行Java...同时,源代码的开放性为学习者和开发者提供了深入理解Java字节码执行机制的机会,以及定制和扩展工具的可能性。对于Java初学者和教育环境,这是一个非常有价值的资源。
【Java字节码结构解析】 Java程序在执行时,首先需要通过Java编译器将源代码(.java文件)编译成二进制的字节码文件(.class文件),这些字节码由Java虚拟机(JVM)解析并执行。深入理解字节码结构有助于我们了解...
总之,Java字节码编辑器是一个强大的工具,它为开发者提供了对Java程序底层运作的直接控制,但也要求使用者具备深入的JVM知识。通过熟练掌握字节码编辑,开发者可以更高效地优化代码、解决问题,甚至探索新的编程...
Java字节码文件查看工具,如JD-GUI,是开发者们深入理解Java应用程序内部机制的重要辅助工具。这类工具能够帮助我们查看并分析.class文件,这些文件是Java源代码经过编译后的二进制形式,包含了运行时所需的所有指令...
Java字节码是Java虚拟机(JVM)执行的低级指令集,它是Java源代码在编译后的结果。深入理解字节码对于优化代码性能、编写高效中间层代码(如字节码级别的库)以及理解JVM的工作原理至关重要。本教程将探讨Java字节码...
`.docx`文档可能详细解析了Java字节码中的各个指令,包括它们的编码、含义、操作数和实际应用。通过阅读这份文档,你可以深入理解JVM如何执行字节码,以及如何通过反编译工具如jad、 jclasslib来分析`.class`文件。 ...
总之,BCEL作为Java字节码操作库,提供了强大的功能,是开发者深入理解并操控Java字节码的重要工具。无论是在开发框架、构建动态代理,还是在进行代码优化和安全审计等方面,都有其不可替代的价值。
Java字节码反编译是Java开发者在进行代码分析、逆向工程或学习类库源码时常用的一种技术。它允许我们将已经编译过的.class文件转换回可读性更强的.java源代码文件,以便理解程序的运行逻辑。在这个过程中,我们通常...
在深入学习Java字节码和ASM之前,我们需要先理解Java编译和运行的基本过程。 1. **Java编译过程**: 当我们编写Java源代码(.java文件)后,Java编译器(javac)将这些源代码转换为字节码(.class文件)。字节码是...
在IT行业中,字节码反编译是一种技术,它允许我们查看和理解那些由编译器生成的中间语言代码,通常是Java...尽管现在有更多先进的替代品,但了解XJad的历史和工作原理对于深入理解Java字节码和虚拟机仍然是有价值的。
Java字节码是Java平台的一种独特特性,它使得Java程序具有跨平台的兼容性和高度的安全性。字节码是Java虚拟机(JVM)能够理解的低级指令集,每条字节码指令对应一种特定的操作。在Java中,我们可以使用字节码技术来...
总的来说,Java字节码反编译工具是Java开发者的重要辅助工具,它们可以帮助我们深入理解运行时环境下的代码行为,提高开发和调试效率。JD-GUI和JD-Eclipse作为其中的代表,提供了方便快捷的反编译体验,无论是在日常...
总的来说,jclazz作为一款优秀的JAVA字节码查看器,为开发者提供了深入洞察Java程序的窗口。通过熟练掌握这款工具,我们可以更好地理解Java运行机制,进行高效的代码调试和优化,从而提升整体的开发水平。在1.2.2...
这个教程可能是为那些想深入了解Java字节码工作原理或者希望自定义字节码解析工具的学习者准备的。 描述中提到,这个教程会展示如何通过编程方式模拟`javap -v filename`命令的功能。`javap`是Java开发工具包(JDK...
**JAVA字节码操作库 BCEL** BCEL(Byte Code Engineering Library)是Java平台上的一款开源库,主要用于处理Java字节码。它提供了对字节码的解析、创建、修改和分析的能力,使得开发者能够深入理解并操作Java类文件...
总的来说,Java字节码的深入研究能够使开发者具备更高级别的编程能力,能够解决复杂的技术难题,优化程序性能,并且更好地应对各种运行时问题。而通过阅读《通过Java字节码发现有趣的内幕之初始化篇(下)》这份资料...
Java字节码技术是Java平台的核心组成部分,它与Java虚拟机(JVM)紧密相连,为各种编程语言在Java平台上提供了可移植性和高效执行的基础。本篇将详细讲解Java字节码的概念、用途以及JVM如何执行字节码。 首先,让...
C++库解析Java字节码的主要目的是为了能够读取、分析或者修改Class文件的结构。这在逆向工程、性能优化、安全分析以及跨语言集成等场景中非常有用。例如,开发者可能需要知道类的结构、方法签名、常量池信息,或者对...
相关推荐
标题中的“class运行器v6”是一个用于执行Java...同时,源代码的开放性为学习者和开发者提供了深入理解Java字节码执行机制的机会,以及定制和扩展工具的可能性。对于Java初学者和教育环境,这是一个非常有价值的资源。
【Java字节码结构解析】 Java程序在执行时,首先需要通过Java编译器将源代码(.java文件)编译成二进制的字节码文件(.class文件),这些字节码由Java虚拟机(JVM)解析并执行。深入理解字节码结构有助于我们了解...
总之,Java字节码编辑器是一个强大的工具,它为开发者提供了对Java程序底层运作的直接控制,但也要求使用者具备深入的JVM知识。通过熟练掌握字节码编辑,开发者可以更高效地优化代码、解决问题,甚至探索新的编程...
Java字节码文件查看工具,如JD-GUI,是开发者们深入理解Java应用程序内部机制的重要辅助工具。这类工具能够帮助我们查看并分析.class文件,这些文件是Java源代码经过编译后的二进制形式,包含了运行时所需的所有指令...
Java字节码是Java虚拟机(JVM)执行的低级指令集,它是Java源代码在编译后的结果。深入理解字节码对于优化代码性能、编写高效中间层代码(如字节码级别的库)以及理解JVM的工作原理至关重要。本教程将探讨Java字节码...
`.docx`文档可能详细解析了Java字节码中的各个指令,包括它们的编码、含义、操作数和实际应用。通过阅读这份文档,你可以深入理解JVM如何执行字节码,以及如何通过反编译工具如jad、 jclasslib来分析`.class`文件。 ...
总之,BCEL作为Java字节码操作库,提供了强大的功能,是开发者深入理解并操控Java字节码的重要工具。无论是在开发框架、构建动态代理,还是在进行代码优化和安全审计等方面,都有其不可替代的价值。
Java字节码反编译是Java开发者在进行代码分析、逆向工程或学习类库源码时常用的一种技术。它允许我们将已经编译过的.class文件转换回可读性更强的.java源代码文件,以便理解程序的运行逻辑。在这个过程中,我们通常...
在深入学习Java字节码和ASM之前,我们需要先理解Java编译和运行的基本过程。 1. **Java编译过程**: 当我们编写Java源代码(.java文件)后,Java编译器(javac)将这些源代码转换为字节码(.class文件)。字节码是...
在IT行业中,字节码反编译是一种技术,它允许我们查看和理解那些由编译器生成的中间语言代码,通常是Java...尽管现在有更多先进的替代品,但了解XJad的历史和工作原理对于深入理解Java字节码和虚拟机仍然是有价值的。
Java字节码是Java平台的一种独特特性,它使得Java程序具有跨平台的兼容性和高度的安全性。字节码是Java虚拟机(JVM)能够理解的低级指令集,每条字节码指令对应一种特定的操作。在Java中,我们可以使用字节码技术来...
总的来说,Java字节码反编译工具是Java开发者的重要辅助工具,它们可以帮助我们深入理解运行时环境下的代码行为,提高开发和调试效率。JD-GUI和JD-Eclipse作为其中的代表,提供了方便快捷的反编译体验,无论是在日常...
总的来说,jclazz作为一款优秀的JAVA字节码查看器,为开发者提供了深入洞察Java程序的窗口。通过熟练掌握这款工具,我们可以更好地理解Java运行机制,进行高效的代码调试和优化,从而提升整体的开发水平。在1.2.2...
这个教程可能是为那些想深入了解Java字节码工作原理或者希望自定义字节码解析工具的学习者准备的。 描述中提到,这个教程会展示如何通过编程方式模拟`javap -v filename`命令的功能。`javap`是Java开发工具包(JDK...
**JAVA字节码操作库 BCEL** BCEL(Byte Code Engineering Library)是Java平台上的一款开源库,主要用于处理Java字节码。它提供了对字节码的解析、创建、修改和分析的能力,使得开发者能够深入理解并操作Java类文件...
总的来说,Java字节码的深入研究能够使开发者具备更高级别的编程能力,能够解决复杂的技术难题,优化程序性能,并且更好地应对各种运行时问题。而通过阅读《通过Java字节码发现有趣的内幕之初始化篇(下)》这份资料...
Java字节码技术是Java平台的核心组成部分,它与Java虚拟机(JVM)紧密相连,为各种编程语言在Java平台上提供了可移植性和高效执行的基础。本篇将详细讲解Java字节码的概念、用途以及JVM如何执行字节码。 首先,让...
C++库解析Java字节码的主要目的是为了能够读取、分析或者修改Class文件的结构。这在逆向工程、性能优化、安全分析以及跨语言集成等场景中非常有用。例如,开发者可能需要知道类的结构、方法签名、常量池信息,或者对...