这章的一个例子虽然简单,但是我觉的很有一定代表性。例子如下:

1:class Act {

2:   public static void doMathForever(int m) {

3:      int i = 0;

4:     int n=4>3?1:0;

5:        for (;;) {

6:           i += 1;

7:            i *= 2;

8:       }

9:    }

10:}

我用javap -verbose Act查看,代码如下:(红色为自己加上的注解)

Compiled from "Act.java"

为编译原文件不一定必须与java语言相关,可以使用其他语言来编写程序,然后将其编译为class文件,所以这里要写上Act.java而不是Act.

呵呵,想来以前为什么javac 来编译源文件时一定要加.java,而java 执行时就不需要加.java了,当时就是搞不懂,现在明白了。

class Act extends java.lang.Object

SourceFile: "Act.java"

SourceFile属性,它提供了产生class文件的源文件的名称,它是一个可选的项,为什么说它是可选项的,因为class可以自己用UE等工具写。

minor version: 0

major version: 49

版本号:我用的是5.0的,出来的major version 是49,书上说1.0或1.2是45,1.4我想可能是48 吧。呵呵,还没有试过。

Constant pool:

这个是常量池,刚看书的时候我还以为常量池放的一定是常量。错。

常量池就是该类型所用常量的一个有序集合,包括直接常量(String,integer,floating  point常量)和对其他类型、字段和方法的符号引用。const #1 = Method #3.#12; //  java/lang/Object."":()V

因为Constant pool#0是不用的,所以只能从#1开始,但不知为什么第一个是Method而不是class,我现在还不明白。

const #2 = class #13; //  Act

CONSTANT_Class是对一个类或接口的符号引用。这个是指向#13

const #3 = class #14; //  java/lang/Object

const #4 = Asciz ;

这个Asciz应该表示是CONSTANT_Utf8吧,因为C ONSTANT_Utf8可以是存储四种基本信息类型:文字字符串、被定义的类和接口描述、对其他类或接口的符号引用以及属性相关的字符串。

是实例的初始化方法,是实例调用方法前必须要的,

是类的初始化方法。const #5 = Asciz ()V;

此的描述符,()V表示没有带参数,返回的是void型的。

书上介绍:

()I  int getSize()

() Ljava/lang/String      String toString()

const #6 = Asciz Code;

Code在所有不是抽象或者本地方法的method_info信息中,都存在一个Code_attribute表。

但是我试一下在抽象的方法中同样也有code的啊,不懂中。const #7 = Asciz LineNumberTable;

LineNumberTable属性建立了方法字节码流偏移量和源代码行号之间的映射关系。关于这一点,我在下面详细谈到。const #8 = Asciz doMathForever;

#8 字段名和方法名以简单名称出现在常量池的入口中,存的时候存简单名字,调用的时候要加 上全限定名const #9 = Asciz (I)V;

doMathForover的描述符,参数是int类型,返回值是void类型const #10 = Asciz SourceFile;

const #11 = Asciz Act.java;

const #12 = NameAndType #4:#5;//  "":()V

NameAndType指向字段或者方法的符号引用的一部分。为什么没有指向#8,#9呢?不懂中。const #13 = Asciz Act;

const #14 = Asciz java/lang/Object;

#13,#14

CONSTANT_Utf8_info 表的入口,容纳了 类/接口全限定名等信息。用“/”代替“.”。在class文件的this_class字段是

对常量池的一个引用,指向了常量池中CONSTANT_ClASS_info表,该表由两项组成,即标签和name_index。在这个例子

里,this_class的值为2,也就是常量池里的第二项,这项标签是class,name_index是13,即指向常量池的第13项。第13项里就

有当前类的全限定名。

{

Act();

Code:

Stack=1, Locals=1, Args_size=1

需要的栈为1个,只是this的存取;本地变量为1个,也是this,方法的参数是1个,也是this传入。   0: aload_0

从局部变量0中装载引用类型。

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

调用Object的方法,因为每个类都是继承Object,所以实例时都要调用Object的方法。

4: return

LineNumberTable:

line 1: 0

public static void doMathForever(int);

Code:

Stack=2, Locals=3, Args_size=1

0: iconst_0

将i 压入栈   1: istore_1

放i   2: iconst_1

同上   3: istore_2

4: iinc 1, 1  i++

7   iload_1 从局部变量1中装载int类型值。

8: iconst_2

9: imul

10: istore_1

11: goto 4

LineNumberTable:

line 3: 0  源代码第3行对应Code中的0偏移量。

line 4: 2

line 6: 4

line 7: 7

line 8: 11

}

java 类文件分析_分析Java .class文件相关推荐

  1. 一个java类可以有_一个.java文件中可以有几个同级类?

    1.在一个.java文件中可以有多个同级类(和public一样的位置,注意不是内部类).其修饰符只可以public/abstract/final/和无修饰符,不能是其他的protected/priva ...

  2. java类的讲解_【java 基础】java类的权限讲解

    java类权限有四种,分别是public,protected,private和默认的权限.其中前三个权限是有明确定义的修饰符的,而默认的权限没有明确的修饰符(我们可以称之为default),在定义类, ...

  3. java 不重启部署_编译Java类后不重启Tomcat有两种方式:热部署、热加载

    不重启Tomcat有两种方式:热部署.热加载 热部署:容器状况在运行时重新部署整个项目.这类环境下一般整个内存会清空,重新加载,这类方式 有可能会造成sessin丢失等环境.tomcat 6确实可以热 ...

  4. 达内java面试题集_达内java面试题

    JAVA面试题-COREJAVA部分1.在main(String[] args)方法内是否可以调用一个非静态方法?答案:不能2.同一个文件里是否可以有两个public类?答案:不能3.方法名是否可以与 ...

  5. java 哈希算法_选择Java密码算法第1部分-哈希

    java 哈希算法 抽象 这是涵盖Java加密算法的三部分博客系列文章的第1部分. 该系列涵盖如何实现以下功能: 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥 ...

  6. java web.xml 监听器_【JAVA 核心技术】java web 中的监听器

    为什么要有监听器? 监听器是用来处理一系列事件的java类,可被配置在java web项目中. 既然如此,为什么不用代码直接调用监听器? 这可能是因为J2EE规范规定的项目工程标准,用web.xml指 ...

  7. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  8. java jmap 分析_利用java虚拟机的工具jmap分析java内存情况

    有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内 ...

  9. java微服务案例分析_《Java深入微服务原理改造房产销售平台》知识点梳理与问答总结...

    一图胜千言 一图胜千言 既然已经在session有了,直接session取就行了,为什么要再放threadlocal,之后再从threadlocal清掉,一直从session拿不就行了? 答: 放在T ...

  10. java界面 文件选择器_掌握java技术 必备java工具应用知识

    在现如今的互联网时代里,Java无疑是一种极为流行的开发语言,无论是程序界还是整个互联网行业势必带来很大的影响.不管是人才需求还是薪资水平上,Java的发展前景都是很乐观的.关于Java的一些常用的工 ...

最新文章

  1. 通过Soul看微内核架构(二)
  2. 圆通招java_圆通java程序员面试经验|面试题 - 职朋职业圈
  3. APOC 15 Years Celebration
  4. Dagger2从入门到熟练
  5. processing link链接
  6. Java 中几种常用的 RPC 框架介绍
  7. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹
  8. 聊一聊,用户画像的前世今生
  9. QT的QDomElement类的使用
  10. 《跟菜鸟学Cisco UC部署实战》-第 0 章 宣传-课件(一共12章,免费)
  11. activiti dmn_新的DMN编辑器预览
  12. 向mysql中添加更新时间_mysql 实现添加时间自动添加更新时间自动更新操作
  13. 实验方法怎么写_小学作文怎么写?“把短句变长句”等3种方法帮孩子提高作文水平!...
  14. 计算机科学论文生成器,数学论文生成器:从此一天一篇不再愁
  15. 投票丨鹿晗关晓彤曝光恋情 是如何搞垮新浪服务器的
  16. 【软件工程】产品调研分析报告
  17. 【CSRF漏洞-01】跨站请求伪造漏洞靶场实战
  18. B2C销售网站的设计与实现
  19. 【SCI】SCI投稿必知必会(长期更新)
  20. 学校机房中计算机软件安装,高校计算机教学机房软件安装与维护

热门文章

  1. The differences between SOAP1.1 and SOAP1.2
  2. WIn server 2012 Install
  3. Progress Control控件的使用
  4. 算法总结之求解模线性方程组
  5. 自动化测试,从入门到跑路1
  6. EPC Class0 Gen1标签识别代码C++
  7. 研发工程师如何转型项目经理
  8. HDU——2768 Cat vs. Dog
  9. openstack之创建虚拟机
  10. 要啥网·商信:一款让所有商业活动一步跨入移动互联时代的APP