学会阅读Java字节码
1.Class文件基础


- package com.cdai.jvm.bytecode;
- public class ByteCodeSample {
- private String msg = "hello world";
- public void say() {
- System.out.println(msg);
- }
- }




const #1 = class #2; // com/cdai/jvm/bytecode/ByteCodeSample
const #2 = Asciz com/cdai/jvm/bytecode/ByteCodeSample;
const #3 = class #4; // java/lang/Object
const #4 = Asciz java/lang/Object;
const #5 = Asciz msg;
const #6 = Asciz Ljava/lang/String;;
const #7 = Asciz <init>;
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Method #3.#11; // java/lang/Object."<init>":()V
const #11 = NameAndType #7:#8;// "<init>":()V
const #12 = String #13; // hello world
const #13 = Asciz hello world;
const #14 = Field #1.#15; // com/cdai/jvm/bytecode/ByteCodeSample.msg:Ljava/lang/String;
const #15 = NameAndType #5:#6;// msg:Ljava/lang/String;
const #16 = Asciz LineNumberTable;
const #17 = Asciz LocalVariableTable;
const #18 = Asciz this;
const #19 = Asciz Lcom/cdai/jvm/bytecode/ByteCodeSample;;
const #20 = Asciz say;
const #21 = Field #22.#24; // java/lang/System.out:Ljava/io/PrintStream;
const #22 = class #23; // java/lang/System
const #23 = Asciz java/lang/System;
const #24 = NameAndType #25:#26;// out:Ljava/io/PrintStream;
const #25 = Asciz out;
const #26 = Asciz Ljava/io/PrintStream;;
const #27 = Method #28.#30; // java/io/PrintStream.println:(Ljava/lang/String;)V
const #28 = class #29; // java/io/PrintStream
const #29 = Asciz java/io/PrintStream;
const #30 = NameAndType #31:#32;// println:(Ljava/lang/String;)V
const #31 = Asciz println;
const #32 = Asciz (Ljava/lang/String;)V;
const #33 = Asciz SourceFile;
const #34 = Asciz ByteCodeSample.java;





Signature: ()V
LineNumberTable:
line 3: 0
line 5: 4
line 3: 10
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lcom/cdai/jvm/bytecode/ByteCodeSample;
Code:
Stack=2, Locals=1, Args_size=1
0: aload_0
1: invokespecial #10; //Method java/lang/Object."<init>":()V
4: aload_0
5: ldc #12; //String hello world
7: putfield #14; //Field msg:Ljava/lang/String;
10: return
LineNumberTable:
line 3: 0
line 5: 4
line 3: 10
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lcom/cdai/jvm/bytecode/ByteCodeSample;
public void say();
Signature: ()V
LineNumberTable:
line 8: 0
line 9: 10
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lcom/cdai/jvm/bytecode/ByteCodeSample;
Code:
Stack=2, Locals=1, Args_size=1
0: getstatic #21; //Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_0
4: getfield #14; //Field msg:Ljava/lang/String;
7: invokevirtual #27; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return
LineNumberTable:
line 8: 0
line 9: 10
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lcom/cdai/jvm/bytecode/ByteCodeSample;
4.小结
学会阅读Java字节码的更多相关文章
- 在Eclipse里查看Java字节码
要理解 Java 字节码,比较推荐的方法是自己尝试编写源码对照字节码学习.其中阅读 Java 字节码的工具必不可少.虽然javap可以以可读的形式展示出.class 文件中字节码,但每次改动源码都需调 ...
- 【转】在Eclipse里查看Java字节码
要理解 Java 字节码,比较推荐的方法是自己尝试编写源码对照字节码学习.其中阅读 Java 字节码的工具必不可少.虽然javap可以以可读的形式展示出.class 文件中字节码,但每次改动源码都需调 ...
- 通过Java字节码发现有趣的内幕之String篇(上)(转)
原文出处: jaffa 很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西.这里没有对Java字节码知 ...
- Java:从面试题“i++和++i哪个效率高?"开始学习java字节码
今天看到一道面试题,i++和++i的效率谁高谁低. 面试题的答案是++i要高一点. 我在网上搜了一圈儿,发现很多回答也都是同一个结论. 如果早个几年,我也会认同这个看法,但现在我负责任的说,这个结论是 ...
- 空手套白狼,硬阅java字节码class文件
如下,是一些java字节码也就是原始的class文件,当应用部署到线上之后,我们能够看到的也就是这样的字样了.那么怎样解呢?就让我们一起,来解读解读字节码吧! Offset A B C D E F C ...
- JVM 内部原理(七)— Java 字节码基础之二
JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- JVM 内部原理(六)— Java 字节码基础之一
JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- java字节码速查笔记
java字节码速查笔记 发表于 2018-01-27 | 阅读次数: 0 | 字数统计: | 阅读时长 ≍ 执行原理 java文件到通过编译器编译成java字节码文件(也就是.class文件) ...
- 从Java源码到Java字节码
Java最主流的源码编译器,javac,基本上不对代码做优化,只会做少量由Java语言规范要求或推荐的优化:也不做任何混淆,包括名字混淆或控制流混淆这些都不做.这使得javac生成的代码能很好的维持与 ...
随机推荐
- 【玩转Golang】reflect.DeepEqual
如果有两个map,内容都一样,只有顺序不同 m1:=map[,,}; m2:=map[,,}; 我们怎么判断二者是否一致呢? 如果你打算这么写: fmt.Println("m1==m2&qu ...
- 使用 SharpSvn 执行 svn 操作的Demo
1. SharpSvn简介 SharpSvn.dll 是为.Net 2.0-4.0+ 应用提供的 Subversion Client API,更多详细介绍请见 https://sharpsvn.ope ...
- 【python】logging
https://docs.python.org/3/howto/logging.html import logging # create logger logger = logging.getLogg ...
- 【CTR】各公司方法
LR + 海量高纬离散特征 GBDT + 少量低纬连续特征 (Yahoo & Bing) GBDT + LR (FaceBook) FM + DNN (百度凤巢) MLR (阿里妈妈) FTR ...
- wget 下载指定url路径下的 指定类型的(全部)文件
wget http://mirrors.ustc.edu.cn/ubuntu/pool/main/g/gcc-4.4/ -r -np -nd -A .deb -e robots=offwget htt ...
- Android 安全提示 笔记
http://developer.android.com/training/articles/security-tips.html1.数据存储内部存储internal storage存储的数据,只能由 ...
- ios开发之--两次模态弹出后,怎么返回最上层的页面
解决方法如下: self.presentingViewController.view.alpha = ;[self.presentingViewController.presentingViewCon ...
- kohana 简单使用
声明:基于公司使用的 Kohana 框架写的,不确定是否适用于原生 Kohana 附:Kohana 3 中文手册,传送门:http://www.lampblog.net/kohana3%E4%BD%B ...
- PostgreSQL流复制
原理机制 参考--https://yq.aliyun.com/articles/51009 主备总体结构 PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组 ...
- MFC之自绘控件
在描绘MFC界面时,MFC自带的控件样式是绝对不满足界面的需求的. 所以我们就要在MFC自带控件基础上对控件样式进行重绘. 在采用自绘前界面样式 采用自绘后界面样式 是不是自绘控件后看起来正常了很多? ...