`
daibalusu
  • 浏览: 341776 次
文章分类
社区版块
存档分类
最新评论

Java class 文件结构分析

 
阅读更多

1. 最简单的一段java代码

public class Test1 {
	public int getNum(int i) {
		return i + 1;
	}
}

对编译之后的class文件,用javap分析该文件,得出的伪机器码

下面对机器码分析

public class Test1 extends java.lang.Object
  SourceFile: "Test1.java"
  minor version: 0
  major version: 50
//这是常量池,进入JVM之后,会被储存在PermArea里
  Constant pool:
const #1 = class        #2;     //  Test1
const #2 = Asciz        Test1;
const #3 = class        #4;     //  java/lang/Object
const #4 = Asciz        java/lang/Object;
const #5 = Asciz        <init>;
const #6 = Asciz        ()V;
const #7 = Asciz        Code;
const #8 = Method       #3.#9;  //  java/lang/Object."<init>":()V
const #9 = NameAndType  #5:#6;//  "<init>":()V
const #10 = Asciz       LineNumberTable;
const #11 = Asciz       LocalVariableTable;
const #12 = Asciz       this;
const #13 = Asciz       LTest1;;
const #14 = Asciz       getNum;
const #15 = Asciz       (I)I;
const #16 = Asciz       i;
const #17 = Asciz       I;
const #18 = Asciz       SourceFile;
const #19 = Asciz       Test1.java;

{
//构造函数
//线程stack只有一层
//有一个变量 就是this变量
public Test1();
  Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return
  LineNumberTable:
   line 2: 0

  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      5      0    this       LTest1;

//自定义方法,stack两层
public int getNum(int);
  Code:
   Stack=2, Locals=2, Args_size=2
//以下是逻辑代码的解释
//首先加载变量
//然后赋值1
//然后加
//然后返回
   0:   iload_1
   1:   iconst_1
   2:   iadd
   3:   ireturn
  LineNumberTable:
   line 4: 0

  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      4      0    this       LTest1;
   0      4      1    i       I


}

2. 代码稍微复杂一点

加上异常处理和对象

import java.io.File;

public class Test1 {
	public int getNum(int i) {
		try {
			new File("xxx.xxx");
			for (int k = 0; k < i; i++) {
				i = i + 1;
			}
			return i;
		} catch (Exception e) {
			return 1;
		}finally{
		
		}
	}
}

Javap分析之后的机器码

public class Test1 extends java.lang.Object
  SourceFile: "Test1.java"
  minor version: 0
  major version: 50
//常量池,不废话
  Constant pool:
const #1 = class        #2;     //  Test1
const #2 = Asciz        Test1;
const #3 = class        #4;     //  java/lang/Object
const #4 = Asciz        java/lang/Object;
const #5 = Asciz        <init>;
const #6 = Asciz        ()V;
const #7 = Asciz        Code;
const #8 = Method       #3.#9;  //  java/lang/Object."<init>":()V
const #9 = NameAndType  #5:#6;//  "<init>":()V
const #10 = Asciz       LineNumberTable;
const #11 = Asciz       LocalVariableTable;
const #12 = Asciz       this;
const #13 = Asciz       LTest1;;
const #14 = Asciz       getNum;
const #15 = Asciz       (I)I;
const #16 = class       #17;    //  java/io/File
const #17 = Asciz       java/io/File;
const #18 = String      #19;    //  xxx.xxx
const #19 = Asciz       xxx.xxx;
const #20 = Method      #16.#21;        //  java/io/File."<init>":(Ljava/lang/St
ring;)V
const #21 = NameAndType #5:#22;//  "<init>":(Ljava/lang/String;)V
const #22 = Asciz       (Ljava/lang/String;)V;
const #23 = class       #24;    //  java/lang/Exception
const #24 = Asciz       java/lang/Exception;
const #25 = Asciz       i;
const #26 = Asciz       I;
const #27 = Asciz       k;
const #28 = Asciz       e;
const #29 = Asciz       Ljava/lang/Exception;;
const #30 = Asciz       StackMapTable;
const #31 = Asciz       SourceFile;
const #32 = Asciz       Test1.java;

{
//构造函数 不废话
public Test1();
  Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return
  LineNumberTable:
   line 3: 0

  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      5      0    this       LTest1;


public int getNum(int);
  Code:
   Stack=2, Locals=3, Args_size=2
//new ? jvm自带的机器码?
   0:   new     #16; //class java/io/File
   3:   ldc     #18; //String xxx.xxx
   5:   invokespecial   #20; //Method java/io/File."<init>":(Ljava/lang/String;)
V
   8:   iconst_0
   9:   istore_2
   10:  goto    19
// i自加1
   13:  iinc    1, 1
//k自加1
   16:  iinc    1, 1
//加载i变量
   19:  iload_2
//加载k变量
   20:  iload_1
//如果k<I 接着循环
   21:  if_icmplt       13
//加载变量I 并且返回
   24:  iload_1
   25:  ireturn
//返回常量1
   26:  astore_2
   27:  iconst_1
   28:  ireturn
//异常表
  Exception table:
//25行到26行之间捕获异常
   from   to  target type
     0    25    26   Class java/lang/Exception

  LineNumberTable:
   line 6: 0
   line 7: 8
   line 8: 13
   line 7: 16
   line 10: 24
   line 11: 26
   line 12: 27

  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      29      0    this       LTest1;
   0      29      1    i       I
   10      14      2    k       I
   27      2      2    e       Ljava/lang/Exception;

  StackMapTable: number_of_entries = 3
   frame_type = 252 /* append */
     offset_delta = 13
     locals = [ int ]
   frame_type = 5 /* same */
   frame_type = 255 /* full_frame */
     offset_delta = 6
     locals = [ class Test1, int ]
     stack = [ class java/lang/Exception ]


}


以上 疯狂的加班中

分享到:
评论

相关推荐

    JavaClass文件的结构分析及其校验.pdf

    上海计算所分析的关于java字节码的结构组成

    java class 结构分析 集合

    这个是个压缩包,里面包含了从各个地方收集来的关于JAVA_CLASS的文件结构的分析。东西都不是我的,自然也不敢说收版权费。所以就小小地收收体力费好了。...(内含五篇,包括:《JavaClass文件的结构分析及其校验》)

    Java Class文件的结构分析及其解析执行.pdf

    java Class文件分析及其解析执行是分析JVM的重要部分,通过实例对Class文件的结构进行了详细分析,并初步实现了Class文件的解析执行。

    java Class文件内部结构解析过程详解

    java class的文件结构,java class文件结构是基于字节流的,用unicode进行编码,下面说说java Class文件内部结构分析

    JavaClass二进制文件加密专家

    JavaClass文件加密专家通过分析Class文件的结构,将Class二进制代码中耗时较多的部份抽出并替换为Native C代码, 并且使用1024位加密算法将Class文件数据加密,任何Java反编译工具均不可能对加密后的文件...

    Java文件结构解析工具

    一个简单的分析工具,用于分析”.class/.cap/.exp”格式的Java文件。 对于CAP文件,支持version 2.1 and 2.2. 适用于JCVM的学习。 使用工具时,需保证“C:\Program Files\WinZip\WINZIP32.EXE”存在,用于解压CAP...

    java字节码分析工具

    系统分析了java字节码文件,即java class类文件,对该文件中的各种成分以树的形式描述出来,只能针对未加密的class文件,一般由标准java编译器编译生成的class文件都未加密,该系统在vs2003下面开发,使用了单文档的...

    实例分析Java Class的文件结构

    今天把之前在Evernote中的笔记重新整理了一下,发上来供对java class 文件结构的有兴趣的同学参考一下

    Java的 Class(类)文件结构详解

    本文将带领大家,一步步,从开头到结尾,逐字逐句分析、了解、深入Class文件组成和结构!   本文类容比较多,不建议直接看,建议收藏,并跟着我的案例一起做!如果10个人中能有3个人跟着学完本文(敲完代码),...

    自己动手写Java虚拟机及class文件解析分析工具(java8运行)

    用go语言写的java虚拟机,主要是清楚的表达了jvm的原理。不懂go语言的其实也没关系,其中classpy这个可执行的jar文件,可以清楚的展现出class文件的结构

    Java类文件加密专家

    Java 类文件加密专家通过分析Class文件的结构,使用1024位加密算法将Class文件数据加密,任何Java反编译工具均不可能对加密后的文件进行破解。 系统特点 1.采用纯C语言开发的内核算法,运行速度极快。 2.彻底...

    java源码包---java 源码 大量 实例

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    JAVA上百实例源码以及开源项目

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    javaclass和源码-deep-in-jvm:简单的借助jdk中的内置工具帮助我们对比Java源码和生成的字节码以及探究Class文件字节

    简单的借助jdk中的内置工具帮助我们对比Java源码和生成的字节码以及探究Class文件字节码结构 使用方法 编写Java源码,如项目目录中的Main.java: 运行javac编译成字节码 javac -g:vars Main.java 编译生成...

    Java虚拟机规范.Java SE 8版.zip

    Java虚拟机规范(Java SE 8版)》完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示...

    Java虚拟机规范(Java SE 7)中文版

    第4章深入分析了用来表示编译后的类和接口的class文件格式,主要包括ClassFile结构、描述符与签名、常量池、字段、方法、属性、代码约束与class文件校验等。第5章定义了Java虚拟机启动以及类和接口的加载、链接和...

    Java 将文本文件写成csv格式文件

    为了实现R语言文本挖掘,所需的csv格式文件,利用Java 将文本文件写成csv格式的文件;文本文件的存放结构为---example ---class1 t1.txt ... ---class2 f1.txt ...

    java虚拟机规范 jdk8.

    Java虚拟机规范(Java SE 8版)》完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示...

    【带书签】Java虚拟机规范(Java SE 7).pdf

    第4章深入分析了用来表示编译后的类和接口的class文件格式,主要包括ClassFile结构、描述符与签名、常量池、字段、方法、属性、代码约束与class文件校验等。第5章定义了Java虚拟机启动以及类和接口的加载、链接和...

    java源码包4

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

Global site tag (gtag.js) - Google Analytics