我们开发中经常使用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模式下,一旦代码执行到改行,程序将进入挂起状态,此时我们能查看到当前的运行状态,如图

条件断点

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

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

改变变量状态

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

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

条件断点 + 代码植入

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

Condition 里插入的代码如下

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

user.setSex("女");

}

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

return false;

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

应用场景

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);

}

}

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

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

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

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

  1. android 代码植入,Android Studio之Debug运行期代码植入的方法

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

  2. Android Studio(2)---如何从不同IDE 工具开发的代码导入 Android Studio

    如何从不同IDE 工具开发的代码导入 Android Studio 将项目迁移至 Android Studio 需要适应新的项目结构.构建系统和 IDE 功能. 如果您要从 Eclipse 迁移至 A ...

  3. Android Studio使用小技巧:提取方法代码片段

    今天,讲讲android studio使用的小技巧.把代码直接提取一个函数. 有些时候我们在一个方法内部写了过多的代码,然后想要把一些代码提取出来再放在一个单独的方法里,通常我们的做法是复制粘贴,现在 ...

  4. Android课程---Android Studio使用小技巧:提取方法代码片段

    这篇文章主要介绍了Android Studio使用小技巧:提取方法代码片段,本文分享了一个快速复制粘贴方法代码片段的小技巧,并用GIF图演示,需要的朋友可以参考下 今天来给大家介绍一个非常有用的Stu ...

  5. android登录操作代码,Android Studio实现第三方QQ登录操作代码

    来看看效果图吧 实现QQ登录了, 新建一个项目工程 ,然后把我们刚才下载的SDK解压将jar文件夹中的jar包拷贝到我们的项目libs中 导入一个下面架包就可以 项目结构如下 打开我们的清单文件And ...

  6. android studio DDMS debug process 无法激活,小虫子灰色

    android studio DDMS debug process 无法激活,小虫子灰色. 如下图,请问什么问题

  7. android+xposed+实例,Android Studio 上第一个 Xposed 模块(示例代码)

    环境: 已root手机一枚 Android Studio一枚 官方文档参考 这里 . 准备工作 我们需要事先下载一个 Xposed installer 安装在手机上,用来管理所有的模块. 安装完成后打 ...

  8. List.size() 问题 Android studio: Verbose,Debug,Info,Warn,Error

    目录 List.size() 问题 Android studio: Verbose,Debug,Info,Warn,Error List.size() 问题 list下标从0开始 假设list.siz ...

  9. 用Android studio写一个轮播图代码

    好的,下面是一个使用Android Studio编写轮播图的示例代码: 首先,在你的布局文件中添加一个ViewPager和一个指示器(例如使用ViewPagerIndicator库),用于显示轮播图和 ...

最新文章

  1. teamviewer 可用设备上限_2020推荐香河气压罐专业供水设备
  2. matlab建模实例运筹学,matlab数学建模实例与编程教程
  3. Plant Simulation常用命令
  4. [C#1] 10-事件
  5. 2.8 使用开源的实现方案-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  6. 操作系统的初始化流程简图
  7. 【AI白身境】一文览尽计算机视觉研究方向
  8. 杂志订阅管理系统c++_电池管理系统BMS功能安全开发流程详解
  9. 在C# 获取当前应用网址
  10. CRM系统-----学员管理系统---admin自定义开发3
  11. android 即时聊天工具 yq,Android 开发即时聊天工具 YQ :(四) 获取好友列表
  12. SQL SERVER 2008的转置函数PIVOT
  13. Intel(R) Matrix Storage Manager 介绍
  14. Python基于openCV火焰识别
  15. Protractor小结
  16. 10年创业消亡史:风口起落的背后,是6271家创业公司的黯然离场
  17. 我们为什么选择NEXTCHIP?为什么要选择ISP?为什么要选择AHD?为什么选择北京冠宇铭通?
  18. 通往SDN之路:可编程网络的思想史
  19. 2021年汽车半导体行业研究报告
  20. 【原创】【百度之星2017资格赛1003】度度熊与邪恶大魔王

热门文章

  1. js console 输出到文件_Node.js核心入门
  2. 清空 linux 服务器,Linux服务器清理
  3. mac mysql 默认字符集_MacOS中Mysql设置默认字符集
  4. em算法示例_带有示例HTML'em'标签
  5. 队列实现栈的3种方法,全都击败了100%的用户!
  6. 被一个熟悉的面试题问懵了:StringBuilder 为什么线程不安全?
  7. Html 按钮button加超链接
  8. INF文件修改注册表
  9. Python获取两个列表list的不同之处
  10. ImportError: No module named ‘pandas.io.data‘