android 代码植入,Android Studio之Debug(一):运行期代码植入

我们开发中经常使用IDE的Debug功能,使用最频繁的就是断点查看变量内容,这篇文章主要是介绍在Debug时很常用的一些功能,如Debug变量更新、动态代码植入等。

背景

看下面一段代码

@Data

@ToString

@AllArgsConstructor

public class User {

private String name;

private String sex;

}

public class Client {

private static final String[] NAMES = {"美队", "浩克", "黑寡妇"};

private static final List USERS = Arrays.stream(NAMES)

.map(name -> new User(name, "男"))

.collect(Collectors.toList());

public static void main(String[] args) {

for (User user : USERS) {

System.out.println(user);

}

}

}

我们直接运行这段代码,得到的输出如下

Client.User(name=美队, sex=男)

Client.User(name=浩克, sex=男)

Client.User(name=黑寡妇, sex=男)

接下来都会围绕这段代码进行说明

普通断点

开发过程中普通断点在Debug过程中使用的算是最频繁的,只要在代码处添加该类型的断点,在Debug模式下,一旦代码执行到改行,程序将进入挂起状态,此时我们能查看到当前的运行状态,如图

bb210905f523592797912e98f7ab40ea.png

条件断点

当添加断点的方法会被多次执行到,而我们只希望程序在特定的一些特定的地方(如只有在当前的user是 黑寡妇 时)断下来,此时我们可以借助条件断点,如下

5265718657561435f65141621b53561b.gif

注意看一下 Condition 部分,此处需要返回一个 boolean 类型的值,该值就是为了告诉程序当执行到该行代码时是否进行断点,true表示进行断点,false反之。 上面只需要对 黑寡妇 进行断点,所以添加的 Condition 是 "黑寡妇".equals(user.getName()) 。

改变变量状态

有时需要对断点时的变量赋值操作,已更改此时变量的值,这时可以使用 Set Value 方式,如下

051945a5be9f2eab5cbba40742d1b25a.gif

除了 Set Value ,还可以通过估值器进行改变值状态,如下

4683118fb0c1cb989d55afb3fec2475b.gif

条件断点 + 代码植入

改变变量状态能够动态地设置变量值,条件断点可以控制断点是能在此处挂起,那将两者结合就能达到在程序不挂起的情况下进行动态代码植入的效果。

c628ae6188368d7d185fa48c2eb79d2c.gif

Condition 里插入的代码如下

if ("黑寡妇".equals(user.getName())) {

user.setSex("女");

}

// 此处返回false为了告诉IDE在该断点出不对程序执行挂起操作

return false;

这就相当于提供了运行期代码的动态植入功能,而且可以通过 Enable/Disable 断点的状态来进行开启/关闭该部分动态代码是否执行。我们可以通过这种方式添加任何希望添加的代码,比如在每个user对象print之前添加自定一段print

e2c8259a4b9580eaffd0c3638735042c.gif

应用场景

Debug期间动态植入的应用场景其实有很多的,对应 Android 端,有时候只需要改变一个变量,添加一行代码就需要重新run整个Project,需要花费整个compile和install的时间才能看出改动之后的效果,如果当前这次更改无效的话,甚至需要再次修改再次运行,而通过debug方式,可以直接对其进行操作。对于后端每次改动之后的重新部署也一样(不考虑动态部署的情况)。

以Android场景为例,如下的代码,接收一个 imageUrl 参数并加载出来

public class ImageActivity extends Activity {

private static final String KEY_CONTENT = "imageUrl";

public static void open(Context context, String content) {

Intent intent = new Intent(context, ImageActivity.class);

intent.putExtra(KEY_CONTENT, content);

context.startActivity(intent);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ImageView imageView = findViewById(R.id.image);

// 取出参数内容

String imageUrl = getIntent().getStringExtra(KEY_CONTENT);

Glide.with(this).load(imageUrl).into(imageView);

}

}

未植入代码之前,跳转到当前页面是这样的

55d98998cfda2f3130610131c62504e7.png

此时如果需要动态改变当前的 imageUrl 参数,可以进行Debug模式,并通过动态代码植入方式进行 imageUrl 变量的重赋值,如下

2362acb551193fae31eb7c1d08a353f0.gif

添加植入的复制代码之后,进入Debug模式,然后重新进入该页面,显示的图片便替换为修改后的了。

af0d0d74a98442afc7a55811307e85d1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中导入、导出Excel——HSSFWorkbook 使用

一、介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。这样在我们实际的开发中,很多时候需要…

android系统电视缺点,高清智能电视安卓系统优势与不足解析

今年,高清智能电视开始成为平板电视市场的一大焦点,其凭借丰富的应用软件打下了大片的“江山”,作为高清智能电视,其高清晰度画面是必然的追求,而应用的丰富度是其最大的买点,其中最为关键的当属智能操作系…

基于流的EXCEL文件导出,SXSSFWorkbook源码解析

当我们在实现excel导出时,在数据量过大的情况下,总是容易发生内存溢出的情况。我们可以使用POI提供的 SXSSFWorkbook 类来避免内存溢出。 注:基于POI4.10版本源码 以下是官方文档对SXSSF包的说明: SXSSF (package: org.apache.p…

【POI】读取Excel表中的数据

确认需要读取的表格的内容: 导入依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.1</version></dependency>package com.example;import org.apache.poi.s…

w15php系列之基础类型

一、计算100之内的偶数之和 实现思路 所有的偶数除2都为0 代码实现 <?php # 记录100以内的偶数和 $number1; $num0; while($number<100){if($number%20){ $num$number;}$number1; } echo $num; ?>输出的结果 二、计算100之内的奇数之和 实现思路 所有的奇数除…

android 魅族系统升级,魅族Flyme6底层安卓系统升级到了Android7.0/7.1,为何时间这么久?...

国产手机系统中&#xff0c;小米的MIUI和魅族的flyme有着众多的用户。相比魅族的系统来说小米MIUI在更新速度上更胜一筹&#xff0c;开玩笑的讲&#xff0c;小米系统已经升级到了MIUI9而魅族仅仅才Flyme6(当然&#xff0c;这更多的是调侃)。不过也从侧面看出&#xff0c;魅族在…

SVN 回滚(撤回)提交的代码

一、 TortoiseSVN -> Show log 二、 注意&#xff1a;步骤二只是让你本地的代码回滚&#xff08;撤回&#xff09;到你未提交前的一个版本&#xff0c;并不会更新到SVN服务器上&#xff0c;也就是说你的同事依然能更新到你错误提交的代码。 右键点击你想撤回的提交 -&g…

Navicat工具获取操作数据库和表的SQL语句

工具 Navicat Premium 15MySQL服务器技术 SQL语句MySQL 在使用Navicat Premium 15客户端时&#xff0c;对数据库和表进行操作&#xff0c;会产生SQL语句。有时我们不记得SQL语句如何编写&#xff0c;可以直接从工具中获取SQL语句。下面利用实例说明获取SQL语句的几种方法&…

html自动适应屏幕分辨率,css如何自适应屏幕大小?

css如何自适应屏幕大小&#xff1f;下面本篇文章给大家介绍一下使用CSS实现屏幕大小自适应的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。css如何自适应屏幕大小&#xff1f;要想实现css屏幕大小自适应&#xff0c;首先得引入…

Navicat Premium 12连接SQLServer[ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序

报错截图&#xff1a; 解决办法&#xff1a; 右击安装图标&#xff0c;点击“打开文件所在位置” 找到下图程序&#xff0c;按自己情况安装 全都默认“下一步”就行。 安装完成后&#xff0c;关闭程序重新打开就可以了。

Springboot的异步、定时、邮件任务

一、异步任务 ​ 1、编写一个类AsyncService ​ 异步处理还是非常常用的&#xff0c;比如我们在网站上发送邮件&#xff0c;后台会去发送邮件&#xff0c;此时前台会造成响应不动&#xff0c;直到邮件发送完毕&#xff0c;响应才会成功&#xff0c;所以我们一般会采用多线程的…

raml2html 安装,Raml实践

Raml实践简介&#xff1a;RAML的全称是RESTful API Modeling Language&#xff0c;这是一种用来描述基于Restful架构的API(设计API)的语言。它的语法规范是基于YAML的新规范&#xff0c;因此机器与人类都能够轻易地理解其中的内容。一、工具安装一、API Workbench(客户端工具-推…

Spring框架中的单例Bean是线程安全的吗?

首先直接给出答案&#xff1a;不是线程安全的 一、分析问题 证明不是线程安全的案例如下&#xff1a; public class Student {private String stuName;public String report(String uname){stuName "大家好&#xff0c;我叫&#xff1a;"uname;try {Thread.sleep…

三诺+n20g+微型计算机,原来是他?揭秘三诺永恒系列开山鼻祖

提起三诺&#xff0c;我们的脑海中常常会浮现出几个关键词&#xff0c;“高性价比”、 “独立功放”、“摩机大赛”等等&#xff0c;摩机大赛让我们对三诺永恒系列2.0音箱有了全新的认识&#xff0c;凭借出色的音质表现&#xff0c;永恒系列广受专业编辑和用户的好评&#xff0…

Spring 中的bean 是线程安全的吗?

结论&#xff1a;不是线程安全的 Spring容器中的Bean是否线程安全&#xff0c;容器本身并没有提供Bean的线程安全策略&#xff0c;因此可以说Spring容器中的Bean本身不具备线程安全的特性&#xff0c;但是具体还是要结合具体scope的Bean去研究。 Spring 的 bean 作用域&#…

天文学专业在什么时候学计算机,南京大学在985排名第几?南京大学最牛的专业是天文系吗?...

选择科目测一测我能上哪些大学选择科目领取你的专属报告>选择省份关闭请选择科目确定v>百年名校南京大学坐落于金陵古都&#xff0c;文化底蕴深厚&#xff0c;是不少考生向往的“211”“985”“双一流”高校。本期圆梦志愿就来带大家看看这所学校在全国985高校中的排名情…

Java中的ThreadLocal详解

一、ThreadLocal简介 多线程访问同一个共享变量的时候容易出现并发问题&#xff0c;特别是多个线程对一个变量进行写入的时候&#xff0c;为了保证线程安全&#xff0c;一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同…

谈谈对ThreadLocal的理解?(基于jdk1.8)

在java的多线程模块中&#xff0c;ThreadLocal是经常被提问到的一个知识点&#xff0c;提问的方式有很多种&#xff0c;可能是循序渐进也可能是就像我的题目那样&#xff0c;因此只有理解透彻了&#xff0c;不管怎么问&#xff0c;都能游刃有余。 这篇文章主要从以下几个角度来…

简单理解BigDecimal.valueof(Double t)与BigDecimal.valueof(String t)的区别——BigDecimal

上面的代码主要的区别在于 初始化BigDecimal时形参是double、String和float的区别 从上面可以看到&#xff0c;当double 和 float 时&#xff0c;实际保存的值并不是是准确的0.99&#xff0c;这是为什么呢 大致的原因是&#xff1a; BigDecimal(double val)将会把double型二…

下图中的蓝月亮为科学家用计算机,2018年高一地理前半期课时练习试卷带答案和解析...

目前人类可以观察到的最高级别天体系统是A. 总星系 B. 银河系 C. 太阳系 D. 地月系【答案】A【解析】本题考查天体系统的层次。距离相近的天体因相互吸引和相互绕转&#xff0c;构成不同级别的天体系统&#xff0c;天体系统的层次为&#xff1a;最高一级为总星系(即目前所知的宇…