当前位置: 首页 > news >正文

安卓中常见的字节码指令介绍

问题背景

安卓开发过程中,经常要通过看一些java代码对应的字节码,来了解java代码编译后的运行机制,本文将通过一个简单的demo介绍一些基本的字节码指令。

问题分析

比如以下代码:

public class test {public static void main(String[] args) {int a = 100;int b = 100;int c = 100;a += b + c;System.out.println(a);}
}

运行结果如下:
运行结果

a += b + c <==> a += (b + c),查看对应的字节码文件如下:

// class version 52.0 (52)
// access flags 0x21
public class test {// compiled from: test.java// access flags 0x1public <init>()VL0LINENUMBER 1 L0ALOAD 0INVOKESPECIAL java/lang/Object.<init> ()VRETURNL1LOCALVARIABLE this Ltest; L0 L1 0MAXSTACK = 1MAXLOCALS = 1// access flags 0x9public static main([Ljava/lang/String;)VL0LINENUMBER 3 L0BIPUSH 100ISTORE 1 // 将100存储到局部变量L1LINENUMBER 4 L1BIPUSH 100ISTORE 2 // 将100存储到局部变量L2LINENUMBER 5 L2BIPUSH 100ISTORE 3 // 将100存储到局部变量L3LINENUMBER 6 L3ILOAD 1 // 从局部变量表中加载 int 类型到操作数栈ILOAD 2 // 从局部变量表中加载 int 类型到操作数栈ILOAD 3 // 从局部变量表中加载 int 类型到操作数栈IADD // 将栈顶两个 int 类型数值相加IADD // 将栈顶两个 int 类型数值相加ISTORE 1 // 将 int 类型存储到局部变量中,这里就是把结果存储到第一个变量L4LINENUMBER 7 L4GETSTATIC java/lang/System.out : Ljava/io/PrintStream;ILOAD 1INVOKEVIRTUAL java/io/PrintStream.println (I)VL5LINENUMBER 8 L5RETURNL6LOCALVARIABLE args [Ljava/lang/String; L0 L6 0LOCALVARIABLE a I L1 L6 1LOCALVARIABLE b I L2 L6 2LOCALVARIABLE c I L3 L6 3MAXSTACK = 3MAXLOCALS = 4
}

问题总结

通过查看java代码对应的字节码,可以比较清楚的看到java代码编译后的执行流程。在安卓开发中,了解字节码知识还是非常有必要的,在关键时刻,我们查看字节码,能够很好的解答一些疑惑,下面是常见的一些字节码指令:

1. 加载和存储指令:aload:从局部变量表中加载引用类型到操作数栈。astore:将引用类型存储到局部变量表中。iload:从局部变量表中加载 int 类型到操作数栈。istore:将 int 类型存储到局部变量表中。fload:从局部变量表中加载 float 类型到操作数栈。fstore:将 float 类型存储到局部变量表中。2. 算术和逻辑指令:iadd:将栈顶两个 int 类型数值相加。isub:将栈顶两个 int 类型数值相减。imul:将栈顶两个 int 类型数值相乘。idiv:将栈顶两个 int 类型数值相除。iand:将栈顶两个 int 类型数值进行按位与操作。ior:将栈顶两个 int 类型数值进行按位或操作。3. 类型转换指令:i2l:将 int 类型转换为 long 类型。l2i:将 long 类型转换为 int 类型。f2d:将 float 类型转换为 double 类型。d2i:将 double 类型转换为 int 类型。4. 控制流指令:if_icmpeq:如果两个 int 类型数值相等,则跳转到指定位置。goto:无条件跳转到指定位置。tableswitch:根据索引值跳转到不同位置的指令。5. 方法调用和返回指令:invokevirtual:调用实例方法。invokestatic:调用静态方法。invokeinterface:调用接口方法。ireturn:从方法中返回 int 类型值。invokedynamic: 运行时动态解析并绑定方法调用

持续更新,有兴趣的小伙伴可以进一步深入研究。

相关文章:

安卓中常见的字节码指令介绍

问题背景 安卓开发过程中&#xff0c;经常要通过看一些java代码对应的字节码&#xff0c;来了解java代码编译后的运行机制&#xff0c;本文将通过一个简单的demo介绍一些基本的字节码指令。 问题分析 比如以下代码&#xff1a; public class test {public static void main…...

TCP的三次握手和四次挥手

文章目录 三次握手四次挥手TIME_WAITCLOSE_WAIT 使用wireshark观察 三次握手 握手的最终目的是主机之间建立连接 首先要有两个预备知识点 三次握手建立连接不一定会成功&#xff0c;其中最担心的就是最后一次握手失败&#xff0c;不过会有配套的解决方案建立好连接后是需要被…...

前后端分离------后端创建笔记(08)表单提交

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…...

途乐证券-KDJ分别代表什么?

KDJ是一种技能剖析东西&#xff0c;常见于股票、期货等商场中&#xff0c;它的全称是随机目标&#xff08;KDJ&#xff09;。KDJ目标包括三条线&#xff0c;分别为K线、D线和J线。那么&#xff0c;KDJ分别代表什么呢&#xff1f;本文将从多个视点进行剖析。 1. KDJ的简单介绍 …...

用C语言重写的原始Matlab OpenShoe算法:深入理解和实现步态分析的关键技术

一、引言 在许多领域&#xff0c;如医疗健康、体育科学、虚拟现实和机器人技术中&#xff0c;步态分析都是一个重要的研究领域。步态分析可以帮助我们理解人体运动的机制&#xff0c;评估疾病的影响&#xff0c;优化运动员的表现&#xff0c;甚至设计更自然的机器人运动。Open…...

什么开放式耳机音质好?值得推荐的开放式耳机分享

与封闭式耳机相比&#xff0c;开放式耳机具有更为自然、真实的音质&#xff0c;能够更好地还原音乐现场的声音环境。以下是几款值得推荐的开放式耳机&#xff0c;都来看看有哪些吧。 推荐一&#xff1a;NANK南卡00压开放式耳机 点评&#xff1a;体验最好的开放式耳机没有之一…...

mac harbor的安装

harbor的安装 为什么要整这个呢&#xff0c;因为我在学习k8s&#xff0c;但是需要一个自己的镜像仓库。于是&#xff0c;最开始想到的就是在本地直接部署一个&#xff0c;还比较安全、快速。 直接下载了官方的项目&#xff0c;运行脚本发现出了异常&#xff0c;这种异常我已经…...

SetActive和Enable有什么不同?

介绍 在Unity中&#xff0c;SetActive和Enable都是常用的方法&#xff0c;用于在运行时控制对象的可见性和功能开启状态。尽管它们的目的相似&#xff0c;但在使用时有一些区别。 SetActive SetActive是GameObject类的方法&#xff0c;用于启用或禁用游戏对象及其所有子对象…...

【Vue-Router】重定向

First.vue <template><h1>First Seciton</h1> </template>Second.vue&#xff0c;Third.vue代码同理 UserSettings.vue <template><h1>UserSettings</h1><router-link to"/settings/children1">children1</ro…...

vulnhub靶场之ADROIT: 1.0.1

准备&#xff1a; 攻击机&#xff1a;虚拟机kali、本机win10。 靶机&#xff1a;Adroit: 1.0.1&#xff0c;下载地址&#xff1a;https://download.vulnhub.com/adroit/Adroit-v1.0.1.ova&#xff0c;下载后直接vbox打开即可。 知识点&#xff1a;shell反弹&#xff08;jar&…...

【非欧几里得域信号的信号处理】使用经典信号处理和图信号处理在一维和二维欧几里得域信号上应用低通滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【深入理解ES6】字符串和正则表达式

概念 字符串&#xff08;String&#xff09;是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol&#xff08;es6新增&#xff09;。 更好的Unicode支持 1. UTF-16码位 字符串里的字符有两种&#xff1a; 前 个码位均以16位的编码单元…...

易服客工作室:Pixwell主题 – 现代杂志/WordPress新闻主题

PixWell主题概述 Pixwell主题是一个强大、多用途和现代的WordPress杂志主题&#xff0c;具有像素完美的设计、出色的功能、完全响应和移动友好。它非常灵活&#xff0c;非常适合食谱、时尚、旅行、技术、个人或任何其他很棒的杂志和博客网站。 该主题与 Elementor、Cooked&am…...

iOS手机无法安装Charles 的ssl证书

问题描述 iOS客户端安装证书时一直卡在下载这一步&#xff0c;无法抓包 1、打开Charles&#xff0c;选择help→SSL Proxying→Install Charles Root Certificate on a Mobile Device or Remote Browser 2、按照步骤1中的提示进行操作&#xff0c;手机连接电脑代理&#xff0c;…...

Promise处理异步操作

Promise是一种在JavaScript中处理异步操作的技术。Promise对象表示一个尚未完成的异步操作&#xff0c;它可以在将来的某个时候产生结果。Promise对象的状态可以是未完成、已完成或已拒绝。当Promise对象处于未完成状态时&#xff0c;我们可以附加一个或多个处理程序&#xff0…...

jpa查询返回自定义对象、返回指定VO、POJO

jpa查询返回自定义对象、返回指定VO、POJO jpa查询返回自定义对象、返回指定VO、POJO&#xff0c;JPA查询前会做大量处理&#xff0c;还有线程通知的操作。若并发大&#xff0c;处理性能直线下降。但是jpa就因为做了大量处理&#xff0c;对多数据库兼容极好&#xff0c;操作方…...

抖音小程序开发,收银台支付回调通知

大家好&#xff0c;我是小悟 关于抖音小程序收银台支付&#xff0c;可阅读【抖音小程序开发&#xff0c;唤起收银台&#xff0c;包括抖音支付、支付宝支付、微信支付】。 做支付功能最重要的一步就是异步回调通知&#xff0c;所谓回调通知就是唤起收银台支付&#xff0c;支付…...

selenium 爬虫

selenium 可以动态爬取网页数据&#xff0c;就像真实用户操作浏览器一样&#xff0c;从终端用户的角度测试应用程序&#xff0c;WebDriver通过原生浏览器支持或者浏览器扩展直接控制浏览器 webdriver下载 因为selenuim对浏览器的版本存在兼容问题&#xff0c;顾需要针对指定浏…...

​亚商投资顾问 早餐FM/0815生成式人工智能服务管理

01/亚商投资顾问 早间导读 商务部等9部门&#xff1a;促进农村大宗商品消费更新换代中央财办等九部门印发指导意见推动农村流通高质量发展《生成式人工智能服务管理暂行办法》今起施行 02/亚商投资顾问 新闻早餐 // 热点聚焦 // 商务部等9部门印发《县域商业三年行动计划&…...

C语言题目的多种解法分享 2之字符串左旋和补充题

前言 有的时候&#xff0c;这个系列专栏中的解法之间并无优劣&#xff0c;只是给大家提供不同的解题思路 我决定将代码实现的过程写成注释&#xff0c;方便大家直接找到对应的函数&#xff0c;只有需要补充说明的知识才会单拿出来强调 这个系列的文章会更的比较慢&#xff0…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

简约商务通用宣传年终总结12套PPT模版分享

IOS风格企业宣传PPT模版&#xff0c;年终工作总结PPT模版&#xff0c;简约精致扁平化商务通用动画PPT模版&#xff0c;素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...