- 博客(237)
- 收藏
- 关注
原创 Shell编程基础(第3篇:命令替换)
前言命令替换,bash编程的核心技术点之一,通过命令替换我们可以获取任何命令的标准输出,以此做进行更复杂的业务逻辑概念命令替换,也称作子命令替换,可以获取到命令的标准输出2种方式1、反引号temp=`date`echo $temp2、$()temp=$(date)echo $temp两种方式均为命令替换的标准语法,反引号是之前的语法规范,$()则是后来新增加的规范,按照技术至上的原则,我觉得使用哪种方式都可以,但是$()可以有更复杂的用法,继续往下看!
2022-02-17 23:22:13
3572
原创 Python 图形界面框架TkInter(第二篇:Window创建过程分析)
(备注:本文基于Python3.7)前言 本想写tkinter的入门教程,后来看到很多优秀的技术爱好者已经对Tkinter有着非常全面的介绍,我临时决定改变策略,决定分析Tkinter框架的源码,创建一个最简单的TkInter应用,只需要下面的3行代码!import tkinterroot = tkinter.Tk()root.mainloop() Windows系统下的效果,标题栏有个羽毛的图标、还有一个英文标题:tk,这个Window是如何创建出来的?tkinte...
2022-01-17 22:04:39
6488
2
原创 Python 图形界面框架TkInter(第六篇:源码中学习所有控件修改属性的方法)
前言我们写一个Label对象,总是会为其赋值属性,假设我们写了这样的一个Label,它的背景是红色import tkinterroot_window = tkinter.Tk()root_window.geometry("200x200")my_label = tkinter.Label(root_window, text="hello world", bg="red")my_label.pack()root_window.mainloop()我们创建的Label对象,
2022-01-12 23:10:04
2667
1
原创 Android之Monkey源码分析(第七篇:Monkey程序如何获知App崩溃,然后自己停止运行的逻辑分析)
前言 Monkey程序是用来执行稳定性测试的,被测App如果出现崩溃,Monkey程序会第一时间收集日志,App出现ANR,Monkey程序也会第一时间收集日志,这些都究竟是怎么做到的呢?这就依靠的是ActivityController...
2022-01-12 22:20:20
4677
原创 Python queue模块源码分析(第一篇:queue模块介绍)
前言 通过queue模块中的对象,我们可以创建线程安全的普通队列,优先级队列、堆栈。它们不仅可以用于线程间交换数据(线程间通信),还支持线程间阻塞(线程间同步),我常常喜欢称它们为【线程间通信+同步】的数据结构!今天通过源码学习作者是如何实现的线程间同步,又是如何实现的线程间通信!queue模块介绍 queue模块源码位于Pythonxx/Lib/queue.py文件中,xx取决于你的版本(本文基于Python3.7),属于标准库中的一员,下面是queue模块中的属性情况...
2022-01-11 23:00:14
2136
原创 Python 图形界面框架TkInter(第五篇:通过Label类学习控件类的设计)
前言 在tkinter图形界面框架中,Label对象表示文本控件,写一个最简单的hello world,离不开Label……import tkinterroot_window = tkinter.Tk()hello_world = tkinter.Label(root_window, text="Hello World")hello_world.pack()root_window.mainloop()输出结果:Label类继承结构class Label..
2021-12-22 01:07:13
1300
原创 Android之Monkey源码分析(第X篇:工具类MonkeyUtils的设计思想)
前言 Monkey程序中,作者设计了两个工具类,分别是MonkeyUtils、MoneyPermissionUtil,今天这篇文章介绍作者如何设计工具类MonkeyUtilsMonkeyUtils类设计分析 由于该类定位是工具类,作者做了几件很酷的事情1、将该类设计为Abstract,使其不能创建对象public abstract class MonkeyUtils {}2、构造方法设为私有 private MonkeyUtils() { }...
2021-12-03 22:36:41
2528
原创 Shell编程基础(第1篇:变量)
前言 当我第一次shell脚本编程的时候,定义一个变量,赋值为Hello World,我习惯性的写下这样的代码my_first = hello world然后我去运行,bash提示了一个错误:./third_shell.sh: line 1: my_first: command not found 我懵逼了……,shell脚本是怎么回事?只是定义个变量就直接拉跨了?当时的我没有系统的学习shell编程,一般都是用到的时候查查资料……后来发现这样完全行不通,必须系统的学习shel....
2021-12-02 23:19:45
1678
原创 Java之String源码分析(第一篇:equals方法是如何比较字符串相等的?)
前言 String,表示字符串,我们会经常创建String对象,使用equals()方法用于比较内容是否相等,那么String的equals()方法是如何实现比较字符串相等的呢?进入代码中一探究竟!equals()方法 equals()方法是定义在父类Object中的一个方法,在Object中的默认实现中,equals()方法仍然使用==比较的是对象的引用是否相等,即两个引用是否指向同一个对象!而String重写了equals()方法,规则则改变为比较字符串的内容是否相等!...
2021-11-21 21:34:58
1861
原创 Java之StringBuilder源码分析(第一篇:创建对象)
前言 String、StringBuilder、StringBuffer都是我们常用的字符串类,那么StringBuilder是怎么实现的字符串拼接?又是怎么实现的删除字符?值得我们深入到源码中一探究竟!StringBuilder类结构public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{ ..
2021-11-21 19:39:07
1029
原创 Python 图形界面框架TkInter(第四篇:定时器详细使用与代码分析)
前言 经过一段时间后,执行一段代码,各个语言都带有这样的功能,而框架内也有封装好的功能,它们常被称作计时器、定时器、延迟消息等等名称,指的都是一回事!最简单的例子import tkinterroot_window = tkinter.Tk()my_show = tkinter.Label(root_window, text="Hello World")my_show.pack()def change_text(): my_show.configure(text..
2021-11-19 22:54:59
3687
原创 Python 图形界面框架TkInter(第三篇:root window的理解)
前言 我们每次创建Tkinter中的控件时,总是会为其指定一个master对象,或者叫做容器对象,表示控件需要放在哪个哪里,另外此举也会防止控件对象被GC回收!如果你仔细观察,你会发现控件对象的第一个默认值参数master也可以什么都不传,此时的控件同样会放在root_window上,这是为什么呢?让我们从代码中一探究竟!创建Button对象时未指定master的例子import tkinterroot_window = tkinter.Tk()first_btn = tki..
2021-11-18 00:25:35
3217
原创 Android之Monkey源码分析(第六篇:系统服务初始化过程分析)
前言 自从Monkey对象创建之后,主流程的run()方法被调用,在run()方法执行过程中,对Monkey对象持有的几个系统服务进行了初始化,没有系统服务的支持,Monkey程序将举步维艰,一起分析一下吧run()方法回顾 run()方法是Monkey类中的一个实例方法,在它的内部执行了Monkey程序的主要流程,在其中一个步骤中,调用了一个getSystemInterfaces()方法,在此方法中,获取到远程系统服务的引用,从而畅快的使用系统服务完成工作private ...
2021-09-14 23:07:12
425
原创 Android之Monkey源码分析(第五篇:解析包名文件过程分析)
前言 Monkey对象的run()方法中包括的Monkey程序执行流程,其中有一个loadPackageLists()方法用于加载包名,我们一起分析一下吧 private int run(String[] args) { …………省略很多源码………… if (!loadPackageLists()) { return -1; } …………省略很多源码…………}loadPackageLists..
2021-09-14 22:43:39
616
原创 Android之Monkey源码分析(第四篇:命令行参数解析过程分析与参数作用阐述)
前言 在第三篇文章中,我分析Monkey程序的主线程执行过程,其中Monkey的run()方法包含了大部分执行流程,今天这篇文章主要分析命令行参数是如何解析到内存中,在monkey程序中使用的!run()方法分析 private int run(String[] args) { ………………省略代码………… mArgs = args; ………………省略代码………… mNextArg..
2021-09-14 22:09:13
1321
1
原创 Python 图形界面框架TkInter(第一篇:Python写GUI应用简介)
前言 TkInter是Python用于开发GUI界面的标准库,快速开发一个带有GUI界面小工具,又能同时在Linux、Windows、Mac上使用,天生的跨平台,以及稳定性,让TkInter脱颖而出,我认为它能满足内部工具的需求,当然它的底层是Tcl/Tk,(备注:Tcl/Tk 是一种简明,高效,可移植性好的编程语言。在信息产业领域具有广泛的应用。)...
2021-09-08 00:08:07
2968
原创 Android之UiAutomator测试框架源码分析(第29篇:UiObject2中的点击控件功能深度分析)
前言UI自动化的三个重要组成部分为查找控件、操作控件、预期结果,UiObject2是如何做到操作控件的?通过本篇源码分析,我们将知道插装测试的点击原理
2021-08-25 22:47:10
1690
原创 Android之Monkey源码分析(第三篇:Monkey主线程执行过程分析)
前言 由第一篇文章可知,monkey程序先由shell脚本执行,shell脚本程序接着使用exec命令替换成一个新的c++程序app_process,再接着由app_process程序创建ART虚拟机实例,然后app_process会根据命令行参数中传递的参数,去加载Java程序,位于/system/framework/monkey.jar这个jar文件中的Monkey类(字节码dex格式)会加载到ART虚拟机内存中,Monkey类是Java程序的入口类,它的静态方法main()会被调用,今天一起..
2021-07-05 22:06:31
2139
10
原创 Android之UiAutomator测试框架源码分析(第二十八篇:线程堆栈日志输出的封装,Tracer类分析)
(注意:本文基于UI Automator测试框架版本为2.2.0)前言 看了好多UiAutomator测试框架的源码,为了能在控制台更好的输出插桩线程执行的日志,Google工程师封装了Trace类,Trace类专门用于在调试,输出log用的,今天一起学习大牛对于日志的管理,如何更好的输出合理的日志Trace类结构public class Tracer {} Trace类位于androidx.test.uiautomator包中,一个继承Object类的功能类,它...
2021-06-24 23:46:33
611
1
原创 Android之Monkey源码分析(第二篇:Monkey的事件来源与事件的总体设计思想)
前言 认真阅读了monkey程序的源码,没想到monkey程序除了支持从命令行直接执行外,还支持从脚本文件中读取命令执行,还可以从Socket中读取命令执行,这真是太牛逼了……这可是2009年左右的代码……程序太稳了,几乎没有再有代码更新,如果你写过Android App,你会发现monkey程序与Android App截然不同,monkey程序是脱离App框架执行流的程序,并且没有图形界面,它是命令行程序,每个Android App的主线程,也称作Ui线程,主线程涉及大量的GUI界面相关的工作。..
2021-06-09 23:17:57
1916
4
原创 Android之Monkey源码分析(第一篇:环境与命令)
Monkey源码获取:https://android.googlesource.com/platform/development.git/前言 monkey,一个Android平台的命令行工具,既熟悉又陌生,很多同学一定熟悉monkey的使用,而陌生的是对它的原理完全不懂,所以才有今天学习Monkey的源码设计,monkey程序是如何实现的呢?monkey源码下载地址:https://github.com/aosp-mirror/platform_development/tree/mas...
2021-05-19 22:43:38
2371
1
原创 Java之Vector源码分析(第七篇:遍历元素)
(注意:本文基于JDK1.8)前言 任何一个容器类对象用于持有元素后,总是需要遍历元素的,即挨个去访问每个元素1次,而遍历元素,除了常规的依赖于数组对象的下标之外,更常用的是封装好的迭代器,今天就来学习Vector中的迭代器是如何设计的,与迭代器相关的方法有:iterator()listIterator()listIterator(int index)3个Vector中的定义的方法,均会返回一个迭代器对象……简单说说这3个方法的来历iterator()方法的来历...
2021-05-14 23:21:31
328
原创 Java之Vector源码分析(第六篇:查找元素)
(注意:本文基于JDK1.8)前言 元素在内存中存储着,为了使用的话,我们总需要查找元素,今天一起学习Vector提供了哪些查找元素的方法 除了获取一个元素,查找元素的下标,检查是否包含某个元素,我把它们都归结为查找元素,不过本文不涉及迭代器中的查找元素,以及遍历元素工作,一起逐个学习一下吧……get(int)方法分析 public synchronized E get(int index) { if (index >...
2021-05-14 22:47:41
1022
2
原创 Java之Vector源码分析(第五篇:修改元素)
(注意:本文基于JDK1.8)前言 增删改查,修改元素,Vector提供了3个方法,包括迭代器中的一个,不过本文只分析Vector自身的两个修改元素的方法,迭代器中的方法将单独分析set(int,E)方法分析 public synchronized E set(int index, E element) { if (index >= elementCount) throw new ArrayIndexOutOfBounds...
2021-05-08 22:19:31
1391
2
原创 Java之Vector源码分析(第四篇:删除元素)
(注意:本文基于JDK1.8)前言 包括迭代器中的remove()方法,以及删除单个元素、删除多个元素、删除所有元素等等的方法,Vector中共计9个对外API用于删除元素,今天就分析一下所有的删除方法是如何实现的。remove(int)方法分析 public synchronized E remove(int index) { modCount++; if (index >= elementCount) ...
2021-05-08 21:54:03
1032
1
原创 Java之LinkedHashMap源码分析(第二篇:创建对象)
private static final long serialVersionUID = 3801124242820219131L;
2021-04-10 21:35:04
296
原创 Java之Vector源码分析(第三篇:添加元素)
(注意:本文基于JDK1.8)前言 算上迭代器的add()方法,一共有7个添加元素的方法,5个添加单个元素的方法,2个添加多个元素的方法,接下来就一起分析它们的实现……Vector是一个线程安全的容器类,它的添加功能是如何做到线程安全的呢?add(E)方法分析 public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount...
2021-03-30 23:55:58
909
原创 设计模式 原型模式轻谈
0、原型模式(Prototype Pattern),嘿嘿,直接上代码吧public abstract class Car implements Cloneable { abstract void go(); protected String carName; @Override protected Object clone() { Obje...
2021-03-30 22:33:50
186
1
原创 Python 函数、类方法、静态方法、实例方法的理解
函数、类方法、静态方法、实例方法都是Python中的术语,可能刚学习Python的同学还分不清楚,学完这篇就完全明白了函数 函数定义在模块中,且不在类中!
2021-03-28 19:37:32
692
原创 Java之Vector源码分析(第二篇:创建对象)
(注意:本文基于JDK1.8)Vector是线程安全的动态数组类,提供了四个创建对象的方式0、无参数的构造方法 public Vector() { this(10); }创建一个空的Vector对象(未持有元素),本构造方法的内部会将数字10传入到一个参数的构造方法中(见本文1号知识点),数字10代表的是Vector对象持有的数组对象的容量1、接受一个int参数的构造方法 public Vector(int initialCa...
2021-02-07 00:15:59
365
原创 Python 常用的字符串格式化的方式
print("fk you %s" % "卧槽") #第一种方式:称作%-formattingprint("fk that %s %s" % ("我知道","你喜欢我")) #第一种方式:使用tupleprint("fk you {}".format("哈哈")) #第二种方式:称作str.formatprint("fk you {...
2021-01-25 21:03:40
651
原创 Android之Looper源码分析(第一篇:创建Looper对象)
Looper提供了两个public的方法,用于创建Looper对象,它的构造方法是private修饰的 private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); mThread = Thread.currentThread(); }0、...
2021-01-19 23:57:21
1779
原创 设计模式 模板设计模式(模版方法模式)
模板设计模式简介别称:模板方法模式英文名:Template Pattern特点1、封装固定的通用逻辑步骤2、具体步骤由不同的子类实现优点1、消除重复代码,便于代码维护缺点1、开发人员具备一定的代码阅读能力实现思路1、父类的方法中定义一个固定步骤流程,在方法体中调用一些作为步骤的抽象方法2、父类包含固定步骤的方法称为模版方法,一般使用final修饰,禁止重写模版方法3、子类重写表示具体步骤的方法(可以是普通方法,也可以是抽象方法)代码
2021-01-13 21:59:28
194
2
原创 Python try、except、finally、else的轻谈
0、真是的,都没空去总结try、except、finally、else,异常体系里重要的四个关键字def printCount(count): #下方例子中都会用这个函数 if count == 100: raise ValueError("I am error") print(count)1、trytry不能单独使用,必须后面跟随except或者fi...
2021-01-13 21:31:05
3114
15
原创 Python 特殊方法、魔法方法的轻谈
前言 如果你使用Python并使用面向对象编程,一定会经常见特殊方法,最常见的特殊方法是__init__,特殊方法最大的特点是它会被Python解释器自动调用,接下来认真学习一下(当然所有的特殊方法当然是定义在类中的)什么是特殊方法? 特殊方法是定义在类中的实例方法,因为支持自动调用,所以称为特殊方法!别称1:魔法方法别称2:内置方法英文名:Magic Method特点:所有的特殊方法均会在某个特定操作时被Python解释器自动调用注意:特殊方法支持手动调用...
2021-01-13 21:27:39
3806
原创 Python之元组解包的3种用法
0、Python真的太智能了,太牛比了,每个元素就是一个的话,那就这样遍历即可for ele in [1,2,3]: print(ele)1、如果list中的每个元素,又是一个集合,例子中是一个tuple,每个tuple有2个元素,然后我们用下面的语法就直接遍历用了,真的是太方便了,用Python,用的我心情荡漾!! for name, value in t...
2021-01-13 21:08:04
10713
1
原创 Python 内置函数dir()与对象的特殊属性以及一切都是对象的轻谈
0、dir()函数很重要,特别重要,同样位于builtin.py下,牛逼的内置函数牛逼1、在理解dir()函数之前,还是要再重温一下,在Python中,一切都为对象,即module、class、method、function这一切的一切都是object2、那么有哪些级别的对象呢?我这么列一下!a、package(同module) package的内容体在哪?就在__i...
2021-01-10 17:58:02
4181
3
原创 Android之AsyncTask源码分析(第五篇:execute方法只能执行一次的原因)
0、我兴高采烈的调用AsyncTask的又去调用execute()方法,崩溃了………………,抛出了一个异常:java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)为什么会这样呢??????????满脑子都...
2021-01-01 09:51:59
2947
1
原创 Android之AsyncTask源码分析(第二篇:创建对象)
0、本文将基于API26对AsyncTask的源码进行一个深入的,风骚的学习1、万事开头难,从哪开始呢?AsyncTask是一个工作线程类,一个可以和主线程交互的工作线程类2、AsyncTask涉及的知识点a、设计模式:模版方法模式b、Java基础:继承、枚举、范型类、内部类、抽象类、容器类、static、finalc、Java并发:volatile、原子类、线程池...
2020-12-31 23:03:44
490
1
原创 Java并发之ThreadLocal源码分析(第一篇:创建对象)
0、ThreadLocal,线程局部变量,或叫线程本地变量均可1、一般共享变量都是所有线程共享的,而线程局部变量,名字也很贴切,就是它作用域只在线程内被访问,算是解决共享变量并发问题的一种思路,不修改原来的共享变量,而是自己复制了一份,自己用2、目前已经知道解决并发问题的三种思路a、CAS方式b、锁方式c、线程局部变量方式3、ThreadLocal里面巧妙的利用...
2020-12-26 10:56:47
507
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅