`
foreversunyao
  • 浏览: 204562 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 类文件概述

阅读更多

转自:http://www.ibm.com/developerworks/cn/java/j-lo-asm30/

所谓 Java 类文件,就是通常用 javac 编译器产生的 .class 文件。这些文件具有严格定义的格式。为了更好的理解 ASM,首先对 Java 类文件格式作一点简单的介绍。Java 源文件经过 javac 编译器编译之后,将会生成对应的二进制文件(如下图所示)。每个合法的 Java 类文件都具备精确的定义,而正是这种精确的定义,才使得 Java 虚拟机得以正确读取和解释所有的 Java 类文件。


图 2. ASM – Javac 流程
图 2. ASM – Javac 流程 

Java 类文件是 8 位字节的二进制流。数据项按顺序存储在 class 文件中,相邻的项之间没有间隔,这使得 class 文件变得紧凑,减少存储空间。在 Java 类文件中包含了许多大小不同的项,由于每一项的结构都有严格规定,这使得 class 文件能够从头到尾被顺利地解析。下面让我们来看一下 Java 类文件的内部结构,以便对此有个大致的认识。

例如,一个最简单的 Hello World 程序:

 public class HelloWorld { 
	 public static void main(String[] args) { 
		 System.out.println("Hello world"); 
	 } 
 } 

 

经过 javac 编译后,得到的类文件大致是:


图 3. ASM – Java 类文件
图 3. ASM – Java 类文件 

从上图中可以看到,一个 Java 类文件大致可以归为 10 个项:

  • Magic:该项存放了一个 Java 类文件的魔数(magic number)和版本信息。一个 Java 类文件的前 4 个字节被称为它的魔数。每个正确的 Java 类文件都是以 0xCAFEBABE 开头的,这样保证了 Java 虚拟机能很轻松的分辨出 Java 文件和非 Java 文件。
  • Version:该项存放了 Java 类文件的版本信息,它对于一个 Java 文件具有重要的意义。因为 Java 技术一直在发展,所以类文件的格式也处在不断变化之中。类文件的版本信息让虚拟机知道如何去读取并处理该类文件。
  • Constant Pool:该项存放了类中各种文字字符串、类名、方法名和接口名称、final 变量以及对外部类的引用信息等常量。虚拟机必须为每一个被装载的类维护一个常量池,常量池中存储了相应类型所用到的所有类型、字段和方法的符号引用,因此它在 Java 的动态链接中起到了核心的作用。常量池的大小 平均占到了整个类大小的 60% 左右。
  • Access_flag:该项指明了该文件中定义的是类还是接口(一个 class 文件中只能有一个类或接口),同时还指名了类或接口的访问标志,如 public,private, abstract 等信息。
  • This Class:指向表示该类全限定名称的字符串常量的指针。
  • Super Class:指向表示父类全限定名称的字符串常量的指针。
  • Interfaces:一个指针数组,存放了该类或父类实现的所有接口名称的字符串常量的指针。以上三项所指向的常量,特别是前两项,在我们用 ASM 从已有类派生新类时一般需要修改:将类名称改为子类名称;将父类改为派生前的类名称;如果有必要,增加新的实现接口。
  • Fields:该项对类或接口中声明的字段进行了细致的描述。需要注意的是,fields 列表中仅列出了本类或接口中的字段,并不包括从超类和父接口继承而来的字段。
  • Methods:该项对类或接口中声明的方法进行了细致的描述。例如方法的名称、参数和返回值类型等。需要注意的是,methods 列表里仅存放了本类或本接口中的方法,并不包括从超类和父接口继承而来的方法。使用 ASM 进行 AOP 编程,通常是通过调整 Method 中的指令来实现的。
  • Class attributes:该项存放了在该文件中类或接口所定义的属性的基本信息。

事实上,使用 ASM 动态生成类,不需要像早年的 class hacker 一样,熟知 class 文件的每一段,以及它们的功能、长度、偏移量以及编码方式。ASM 会给我们照顾好这一切的,我们只要告诉 ASM 要改动什么就可以了 —— 当然,我们首先得知道要改什么:对类文件格式了解的越多,我们就能更好地使用 ASM 这个利器。

 

分享到:
评论

相关推荐

    完整版 Java编程基础入门教程 Java语言程序设计 第1章_java概述(共50页).ppt

    完整版 Java编程基础入门教程 Java语言程序设计 第1章_java概述(共50页).ppt 完整版 Java编程基础入门教程 Java语言程序设计 第2章_语言基础(共45页).ppt 完整版 Java编程基础入门教程 Java语言程序设计 第3章_...

    Java 字节码概述

    Java 字节码概述ppt说明文档,欢迎交流

    Java概述_2 视频文件

    Java概述_2 视频文件

    java学习文件(清华版)

    [ 第1章 面向对象软件开发概述 ] [ 第 2章 JAVA概述 ] [ 第 3章 JAVA语言基础 ] [ 第 4章 抽象、封装与类 ] [ 第 5章 继承与多态 ] [ 第 6章 工具类与算法 ] [ 第 7章 图形界面的设计与实现 ] [ 第 8章 Java高级编程...

    java02——Java概述

    答:编译的动作其实就是翻译,把操作系统看不懂的内容变成操作系统能看懂的内容->产生新的class文件(字节码文件) 3)①Java SE: Java 语言的标准版,用于桌面应用的开发,是其他两个版本的基础; ②Java ME:...

    JAVA_API1.6文档(中文)

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    Java poi导入导出EXCEL工具类(兼容各版本)

    概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...

    java通用文件上传功能技术实现

    一、文件上传概述: 在实际的开发中,经常会遇到需要上传文件到服务器的场景。对于Java开发者来说,使用Http协议进行文件上传是一种常见的方式。本文将介绍如何使用Java的HttpPost方法实现文件上传,并提供相关的...

    使用Java创建文件压缩工具 - 一个实战教程

    在这个实战博客中,我们将创建一个简单的Java文件压缩工具,用于创建和解压缩文件归档。我们将深入了解Java编程语言以及Java的压缩和解压缩库,以帮助您构建自己的文件压缩工具。 以下是本实战博客的主要内容: ...

    java 线程 dump 分析工具 2.3.3

    它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的统计信息,提供关于锁定监视器和等待线程的信息。它可以在线程之间进行区分,以寻找相似之处,并具有“长运行线程”检测。如果记录了类的...

    使用Java创建文件同步工具 - 一个实战教程

    在这个实战博客中,我们将创建一个Java文件同步工具,演示如何使用Java编程语言和文件操作来实现文件和文件夹的同步功能。 以下是本实战博客的主要内容: 项目概述 准备工作 创建Java项目 设计文件同步逻辑 实现...

    JAVA文件传输的实现.rar

    Java文件传输的实现是指利用Java编程语言设计和开发系统,实现在网络环境下的文件传输功能。以下是该实现的描述: 技术概述: Java文件传输是指在客户端和服务器之间通过网络传输文件的过程,可以实现文件的上传、...

    Java概述_3 视频

    Java概述_3 视频文件

    java类加载机制.xmind

    该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...

    java接口方法概述集合详解.docx

    1、接口是Java语言中的一种引用类型,是方法的"集合",...它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。 public class 类名.java–>.class public interface 接口名.java–>.class

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-011-Java语言概述-Java的工作原理-源文件及字节码文件.mp4 北京动力节点-Java编程零基础教程-012-Java语言概述-Java的工作原理-JVM分类.mp4 北京动力节点-Java编程零基础教程-...

    Java 1.6 API 中文 New

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    Java语言实用教程

    本书共12章,从程序设计方法讲起,详细介绍了Java开发环境、语法知识、数组、类、对象、继承、接口等面向对象程序设计和开发的知识及应用,同时包括异常处理、输入输出方法、图形图像、多媒体、Applet等方面的内容。...

Global site tag (gtag.js) - Google Analytics