- 博客(528)
- 资源 (13)
- 问答 (4)
- 收藏
- 关注
原创 c-10 位段/位域
我们在日常开发经常需要一个字段表示多个状态的需求,比如一个status需要表示是否可读可写可执行。如下代码:#include<stdio.h>#include<stddef.h>//掩码#define EXECUTABLE 1#define READABLE 2#define WRITEABLE 4int status = (READABLE | READABLE);void main(int argc, char *argv[], char *envp[]) {
2020-08-02 01:04:23 205
原创 c-9 结构体对齐计算等
结构体成员属性偏移对齐我们看如下列子,并考虑结构体每个成员属性偏移struct MyStruct{ char name[9];//9 int age; //4 char gender;//1 float height;//4 double weight;//8 // 9+4+1+4+8=26};然后我们查看内存结构:我们惊讶的差异在name之后空出了3个字节内存cc,而在gender到height内存结构中同样也多出了3个字节的cc.一个多出了6个空白字节,那么加上固有
2020-07-27 01:02:18 230
原创 我所理解的JMM--3 内存屏障
内存屏障(Memory Barriers)内存屏障可以说是一些指令集,作用于cpu和编译器大致作用:防止屏障指令前后代码乱序,乱序包括内存顺序,和执行顺序。理解内存屏障对于理解理解JMM至关重要。因为不管是volatile和happer-before都需底层插入内存屏障实现。文本以x86架构说明。现代化cpu结构读取流程:cpu从内存读取数据,然后放入L1,L2缓存区,然后从L1 L2存缓存区放入Load Buffer,最后由Cpu寄存器读取,二次读取的时候从Load Buffer读取即可,如
2020-07-19 22:57:30 1088
原创 我所理解的JMM-- 2 new原子性
概述文本探讨构造函数是否为原子性问题。案例我们首先如下代码:public class Person { public int age; public Person() { age=20; }}//构造对象public class JavaMain { public static void main(String[] args) { Person person = new Person(); }}
2020-07-19 16:18:00 561
原创 c-8 内存分区之数据区
基础概念一个c源文件经过编译会生成一个二进制文件。而编译器会将我们相同属性的代码放在相近的一段位置。比如我们的全局变量,会放在相近位置,而代码数据又会放在别的二进制位置。如下图所属:例子:#include <stdio.h>//全局初始化区域int globalIntOne=0x123456;int globalIntTwo=0x5201314;//全局未初始化区域int uninitGlobalIntOne;int uninitGlobalIntTwo;void
2020-07-17 22:53:52 293
原创 我所理解的JMM-- 1概述
JSR 是什么?JSR是Java Specification Requests全称,用于制定java规范的东西。我们的JMM就是制定在JSR中。本文仅讨论JSR133.JMM是什么JMM 是 JAVA Memory Model ,它定义了虚拟机和编译器所需要遵守的规则。JMM存在的意义多线程通信方式大体上分为两种形式:1.消息传递2.共享内存两者分别有各自的优劣:(1)消息传递:往往依赖于事件循环,效率略低,但不需要考虑多线并发问题,如Dart语言便是其中一个。(2)共享内存:多线程共享
2020-07-14 00:32:36 370
原创 c-6 函数调用与内存结构
函数可以提高程序的复用性,减少重复代码。而函数间的调用和返回需要协定大量的协议。比如A函数传参到B函数,需要协定传参顺序,返回地址,寄存器变量的保存等,我们可以把这些统称为上下文切换。我们一个函数一般拥有如下内存结构(栈由高地址指向低地址,高地址为栈底):我们函数调用拥有如下流程:1)参数传入顺序协定首先函数A调用B需要协定传入参数:我们在c语言中有如下几个协定关键字其中举例说明__cdecl:__cdecl全程叫c declaration,传入参数顺序从右到左,函数调用完之后的栈空间由
2020-07-08 23:27:57 277
原创 c-5 IEEE754浮点表示法
Float 存储格式IEEE754标准中 以32位float存储方式举例说明:其中符号位占据1位。指数位占据8位。尾数23位。指数位:当然指数位也被叫做阶码 ,阶码使用移码进行表示。移码如果阶码的数位为N(有几个二进制位 ,即bit),那么那么我们首先需要计算出一个偏移值,bias=2n-1-1作为偏数值,然后你想计算数为X,移码的结果为E.那么E=bias+x.为何偏移是2^n-1^后文会讲解。(也有人使用bias=2n-1表示偏移值,这里表示的2进制在n-1位数最大表示的数值,比如n
2020-07-05 19:38:11 1195
原创 c-04 CPU基本运算与补码
现代计算机cpu只能进行逻辑运算,即 与,或,非,异或,左移 右移。关于这块的具体原因可以Google搜索逻辑门等相关电路学科知识。那么我们所有的加减乘除都必须使用上述上个基本逻辑去完成。而补码的出现就是为了辅助计算。补码其实跟c语言无关,但是是因为学c语言期间学的所以记录下。如何使用基本逻辑运算完成加法运算?假设我们存在两个数据:A = 1,B = 1。(注意这里的1是二进制,也就是A+B=10)在计算机计算A+B:进位部分 对A和B进行逻辑与操作,那么本案例中:A与B=1所以进位部分
2020-07-05 00:15:06 1015
原创 c-3 随机函数
以下为c常见随机数生成方法#include <stdio.h>#include<time.h>#include <stdlib.h>void main(){ srand(time(NULL)); printf("%d\r\n",rand()); getchar();}srand函数和rand函数在vc库的实现如下#include <cruntime.h>#include <mtdll.h>#include
2020-07-02 23:57:56 274
原创 c-2 大小端
在现代计算机中利用高低电频区分数据,换句话说所有数据只能有两种表现形式。所以我们用二进制各种排列组合形成一个文件。我们存储一个数据如999(对应十六进制为03E7)存储在硬盘或内存。其中03为高地址字节,E7为地址字节。大端模式:第一种存储999这个数据的方式 让03放入硬盘开始位置,E7放入硬盘结束位置。也就是这种存储方式叫做大端模式。那么最后的存储结果是03E7,这种存储方式让我们查看数据的时候非常自然。但是换一个方向去思考,就是数据的高地址位放存储低地址位,这在逻辑上显得突兀。小端模式第二种
2020-07-02 23:42:45 634
原创 C-1 入门知识
笔者在WIN10和VC6.0下学习的笔记。标题编译编译在VC安装目录C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin就IDE编译套件。文件信息如下:
2020-07-02 00:21:55 804
原创 Gradle生命周期
Gradle执行构建需要经过三个阶段:初始化阶段配置阶段执行阶段本文将就三个阶段,所触发的回调做讲解。初始化阶段解释执行settings.gradle脚本确定子参与构建的子工程。然后每个确定的子工程会创建一个Project对象。开发者可在 settings.gradle中使用include("xxx")语法添加子工程。如下settings.gradle文件所述:rootProject.name = 'JavaExample'//包含子工程 属于 初始化阶段include 'Chil
2020-06-30 01:04:32 443
原创 Gradle 依赖关系和冲突
前言在java编程过程中不免使用大量的第三方库文件,当存多个库文件存在同包同类名的情况时,将发生不可预计的错误,所以依赖冲突是必须解决的一个常规性问题。什么是依赖传递简单来说就是就是A工程依赖B,B依赖C和D。那么A工程将得到B,C和D工程的类。Gradle对于传递依赖 可以把传递依赖变为编译时依赖,也可以默认打包进宿主工程中。-gradle 关闭全部传递依赖//A 工程依赖声明dependencies { //依赖B工程(B工程同时依赖C,D)。 // 但是把传递依赖
2020-06-08 23:47:02 846
原创 Groovy 构建生成器
我们在使用Groovy感觉到解析xml于json 时特别方便,其实这一切背后都依赖于groovy的MOP的实现,但是我们要整个利用这个特性或许太复杂,所以groovy提供了一些帮助类帮我们简化操作。BuilderSupport首先我们看下这个类的一些方法回调class MyBuild extends BuilderSupport { /** * 当一个闭包内部添加一个新的子节点 * @param parent * @param child */
2020-05-26 22:55:14 612
原创 Groovy Xml解析
生成XML:MarkupBuilder方式:import groovy.xml.MarkupBuilderimport groovy.xml.StreamingMarkupBuilderdef stream = new ByteArrayOutputStream(200)def osw = new OutputStreamWriter(stream)def builder = new MarkupBuilder(osw)builder.asd { book {
2020-05-25 21:42:43 1438
原创 Groovy Json解析
如何生成Json字符串JsonBuilder利用元编程的特性帮助我们快速生成一个json字符串import groovy.json.JsonBuilderdef json = new JsonBuilder()json.book { info { name = "Java入门到放弃" author = "XiaoMing" } version { mainVersion "1.0" }}//漂亮的格式化输出js
2020-05-24 23:23:33 1535
原创 Groovy MOP3-metaclass
本章将简单讲解metaclass。What MetaClassMetaClass是Goorvy实现语言动态核心类,用于路由方法/属性调用,扩展等.Where MetaClass对于Groovy对象内部存在一个metaclass属性,对于Java对象的metaclass对象存在groovy.lang.MetaClassRegistry中。举个例子:def registry = GroovySystem.getMetaClassRegistry()println registry.getMetaC
2020-05-21 22:46:19 319
原创 Groovy MOP-2
对于Groovy创建的类MOP方法或者属性存在以下调用协议:再看了上面的对类的扩展方法后我们来看看MOP方法调用协议部分:协议一 :对于一个Groovy创建的类(后面简写为POGO),如果实现了GroovyInterceptable接口,那么所有的方法调用都必须线调用invokeMethodclass Person implements GroovyInterceptable { @Override Object invokeMethod(String name, Object
2020-05-20 22:49:56 203
原创 Groovy MOP-1
静态方法/属性注入:String.metaClass.'static'.sayHello = { println("hello world")}String.'sayHello'()String.sayHello()构造函数注入:String.metaClass.constructor = { Integer p -> new String("hello world" + p)}println new String(1)实例属性/方法注入String.me
2020-05-20 00:15:25 412
原创 Groovy读取properties文件
在java配置文件中经常需要读取properties文件,在groovy提供了一些非常方便的方式。我们看下properties长什么样://connfig.propertiesname = "张三"age = 1ConfigSlurper就是一个帮助类,他可以读取标准的properties文件或者groovy脚本形式的配置文件。def config=new ConfigSlurper().parse(new File("/Users/fmy/IdeaProjects/groovy2/src/
2020-05-13 22:59:48 2646
原创 Groovy脚本执行
Groovy是一个可以解释执行的语言,在解释执行的情况下具有以下基础语法特征。groovy xxx.groovy方式运行一个groovy文件.在解释执行的Groovy文件中,有如下特点:文件运行在一个Script对象中。def关键字可以省略举个例子://省略def不写name = "XiaoMing123"//闭包不写defmyClosure = { age = 3 println(age)}println(name)myClosure.call()//运行
2020-05-13 22:49:09 1778
原创 Groovy 方法扩展
在Groovy允许对一个类的进行添加额外的静态方法或者实例方法。步骤:编写一个静态方法。在META-INF/service/org.codehaus.groovy.runtime.ExtensionModule文件声明扩展函数位置。打成jar 。Demo:我们首先实现对String实例方法进行扩展,判断这个字符和另一个字符串是否包含字符*。扩展函数语法要求:必须有至少一个参数,且第一个参数类型是扩展的类函数必须为静态package org.fmyclass StringExt
2020-05-13 20:21:59 960
原创 Groovy的Bean对象
get 和set函数groovy中所有类成员编译后会自动生成get set 函数class Person{ def name def age def high def sex}在编译后会自动生成get和set函数(其他生成函数请无视,这是元编程内容)。public class Person implements GroovyObject { private Object name; private Object age; private
2020-05-09 22:55:31 516
原创 Groovy函数调用
函数声明def [返回值类型] 函数名:其中[返回值类型]可以省略,那么返回类型为任意对象def int fun1() { println "fun1" return 1}def fun2() { println "fun2" return 1}函数不需要显示return当一个函数返回时,默认以最后一行的对象作为返回值def fun3() { println "fun3" //函数最后一行作为返回值 1}def f
2020-05-09 22:42:16 5775
原创 Groovy 闭包
闭包声明我们看下如何声明一个闭包:def myClosure={ println("I'm Closure")}//调用闭包的方式一myClosure()//调用闭包的方式二myClosure.call()输出:I’m ClosureI’m Closure闭包参数在默认情况下闭包会传递一个null数值,如果没有命名这个参数那么以it命名。def myClos...
2020-05-07 12:55:50 217
原创 Groovy循环
本文讲解java不存在的几种遍历函数或者方式for 循环IntRange方式IntRange方式的for循环class Main { public static void main(args) { //输出1到3 for (i in 1..3) { println("$i") } }}其实1…3...
2020-05-04 18:04:29 649
原创 Groovy 基本语法
本文将简单讲解Groovy语言相关基础知识,如果你学过其他的类Kotlin活swift那么你讲非常轻松了解其语法。关于groovy工程的创建和启动这里并不过多说明,大家可以直接使用idea即可变量定义groovy中变量定义具有自动推断机制,也就是无需声明类型。变量的定义可以采用def关键字。class Main { public static void main(args) { ...
2020-05-04 15:32:12 598
原创 Kotlin协程核心库分析-7 Sequence
Sequence是一个kotlin序列生成器对象,其他语言也都有其相对应的Api(如Dart)。简单看下如下例子fun foo(): Sequence<Int> = sequence { // 序列构建器 for (i in 1..3) { Thread.sleep(100) // 假装我们正在计算 yield(i) // 产生下一个值 ...
2020-04-29 22:37:50 555
原创 Kotlin协程核心库分析-3 Job链
概述我们知道协程启动后可以在内部在启动一个子协程,当存在这样的结构化层级时父协程的取消会引起子协程立即跟随取消,当子协程存在未捕获的异常时同样会级联到父协程的取消。并且协程启动后返回的Job对象时可以监听完成和取消事件。这一切背后的都靠背后一个链表保存所有的子协程和监听器。...
2020-04-19 22:40:05 1271
原创 App签名
待续import java.math.BigInteger;import java.util.Base64;public class Main { public static void main(String[] args) { String s = toByteArray("1985f800b4cd27c69343ebffb3adcca2e995e6ffc51a8...
2020-04-17 21:04:48 238
原创 Kotlin协程核心库分析-2 Job简述
未完待续。。Job是标准库中启动协程后返回的对象,代表着协程本次作业。我们可以判断协程是否结束,是否取消,是否完成并且可以取消当前协程以及嵌套子协程。我们简单的看下面的代码如何获取job对象fun main() { val job = GlobalScope.launch { } //协程是否存活 job.isActive //是否取消 ...
2020-04-15 23:33:09 2368 2
原创 Kotlin协程源码分析-8 拦截器
前言协程拦截器ContinuationInterceptor作用:线程切换hook结果(一般用不到)我们开发Swing或者Android更新UI需要在特定的线程上进行操作,那么这里就涉及线程的切换问题,那么我们看看ContinuationInterceptor在本章中如何使用和源码分析。简单案例class MyContinuation() : Continuation<St...
2020-03-29 17:41:14 1736 2
原创 Kotlin协程源码分析-6 suspendCoroutineUninterceptedOrReturn注意点
学完状态机之后来看看他可以帮我们理解什么。我们回头看看suspendCoroutineUninterceptedOrReturn获取挂起函数的注意点:1.不要轻易在同一个调用挂起函数的栈帧中调回Continuation.resumeWithException或者Continuation.resume2. 如果不是立即返回结果,请务必返回kotlin.coroutines.intrinsics...
2020-03-27 21:58:10 1390
frida-12.8.20-py2.7-macosx-10.9-intel.egg
2020-04-05
AIDL bindservice流程图
2017-09-29
fastjson 阿里巴巴的解析生成json工具
2016-09-01
Android 控件顶部阴影如何添加?
2017-04-14
Git创建本地仓库后 如何给他人地址?地址是什么
2016-10-18
安卓最新studio2.1 导入github项目选择那一项 谢谢
2016-10-13
安卓SDK目录中build-tools是用来干嘛
2016-08-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人