java 类文件分析_分析Java .class文件
这章的一个例子虽然简单,但是我觉的很有一定代表性。例子如下:
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文件相关推荐
- 一个java类可以有_一个.java文件中可以有几个同级类?
1.在一个.java文件中可以有多个同级类(和public一样的位置,注意不是内部类).其修饰符只可以public/abstract/final/和无修饰符,不能是其他的protected/priva ...
- java类的讲解_【java 基础】java类的权限讲解
java类权限有四种,分别是public,protected,private和默认的权限.其中前三个权限是有明确定义的修饰符的,而默认的权限没有明确的修饰符(我们可以称之为default),在定义类, ...
- java 不重启部署_编译Java类后不重启Tomcat有两种方式:热部署、热加载
不重启Tomcat有两种方式:热部署.热加载 热部署:容器状况在运行时重新部署整个项目.这类环境下一般整个内存会清空,重新加载,这类方式 有可能会造成sessin丢失等环境.tomcat 6确实可以热 ...
- 达内java面试题集_达内java面试题
JAVA面试题-COREJAVA部分1.在main(String[] args)方法内是否可以调用一个非静态方法?答案:不能2.同一个文件里是否可以有两个public类?答案:不能3.方法名是否可以与 ...
- java 哈希算法_选择Java密码算法第1部分-哈希
java 哈希算法 抽象 这是涵盖Java加密算法的三部分博客系列文章的第1部分. 该系列涵盖如何实现以下功能: 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥 ...
- java web.xml 监听器_【JAVA 核心技术】java web 中的监听器
为什么要有监听器? 监听器是用来处理一系列事件的java类,可被配置在java web项目中. 既然如此,为什么不用代码直接调用监听器? 这可能是因为J2EE规范规定的项目工程标准,用web.xml指 ...
- java项目----教务管理系统_基于Java的教务管理系统
java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...
- java jmap 分析_利用java虚拟机的工具jmap分析java内存情况
有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内 ...
- java微服务案例分析_《Java深入微服务原理改造房产销售平台》知识点梳理与问答总结...
一图胜千言 一图胜千言 既然已经在session有了,直接session取就行了,为什么要再放threadlocal,之后再从threadlocal清掉,一直从session拿不就行了? 答: 放在T ...
- java界面 文件选择器_掌握java技术 必备java工具应用知识
在现如今的互联网时代里,Java无疑是一种极为流行的开发语言,无论是程序界还是整个互联网行业势必带来很大的影响.不管是人才需求还是薪资水平上,Java的发展前景都是很乐观的.关于Java的一些常用的工 ...
最新文章
- 通过Soul看微内核架构(二)
- 圆通招java_圆通java程序员面试经验|面试题 - 职朋职业圈
- APOC 15 Years Celebration
- Dagger2从入门到熟练
- processing link链接
- Java 中几种常用的 RPC 框架介绍
- python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹
- 聊一聊,用户画像的前世今生
- QT的QDomElement类的使用
- 《跟菜鸟学Cisco UC部署实战》-第 0 章 宣传-课件(一共12章,免费)
- activiti dmn_新的DMN编辑器预览
- 向mysql中添加更新时间_mysql 实现添加时间自动添加更新时间自动更新操作
- 实验方法怎么写_小学作文怎么写?“把短句变长句”等3种方法帮孩子提高作文水平!...
- 计算机科学论文生成器,数学论文生成器:从此一天一篇不再愁
- 投票丨鹿晗关晓彤曝光恋情 是如何搞垮新浪服务器的
- 【软件工程】产品调研分析报告
- 【CSRF漏洞-01】跨站请求伪造漏洞靶场实战
- B2C销售网站的设计与实现
- 【SCI】SCI投稿必知必会(长期更新)
- 学校机房中计算机软件安装,高校计算机教学机房软件安装与维护