上一篇文章 我讲了用 @CName 这个神奇的注解,可以配置 Kotlin Native 函数在符号表中的名字,进而根据 Jni 静态绑定的规则来对应到 Java native 方法,但实际开发当中我们更喜欢用动态注册的方式...如果大家习惯用 C 写动态绑定的代码,那么 Kotlin Native 写起来思路也是很简单的,只要依样画葫芦,就可以写出来,我们先给出代码: @CName("JNI_OnLoad") fun JNI_OnLoad...Kotlin Native 映射时, CPointer 的左值类型会映射成 CPointerVar,我现在对 Kotlin Native 与 C 的交互还没有仔细研究,就暂时不展开说了,等后面有机会再系统介绍...因此理想的状况是,我们用 Kotlin Native 对 C 接口进行封装,将这些底层的工作按照 Kotlin 的风格进行转换,这样我们使用起来就会容易得多——官方的 AndroidNativeActivity...(envStorage.value, jclass, jniMethod, 1) 这里面也向大家展示了如何将 Kotlin 函数转为 C 的函数指针,总体来讲思路还是很简单的,毕竟我们只是照猫画虎。
结论: 1)当使用基本数据类型作为方法的形参时,在方法体中对形参的修改不会影响到实参的数值 2)当使用引用数据类型作为方法的形参时,若在方法体中 修改形参指向的数据内容,则会对实参变量的数值产生影响,...因为形参变量和实参变量共享同一块堆区; 3)当使用引用数据类型作为方法的形参时,若在方法体中 修改形参变量的指向,此时不会对实参变量的数值产生影响,因此形参变量和实参变量分别指向不同的堆区 例一:基本数据类型作为形参...return this.age; } public void setAge(int age) { this.age = age; } } 例二:引用类型...this.name[1]; } public void setName(String[] name) { this.name = name; } } 例三:引用类型
在一些项目需求中需要父组件向子组件动态传值,比如我这里的需求是,父组件动态通过axios获取返回的图片url数组然后传给子组件,上传图片的子组件拿到该数组后进行遍历并展示图片,因为有时候获取到的会是空,...所以这里要考虑到动态获取。...方法有两种, 方法一: props传值,这里注意一个问题,传过来的值需要用watch监听并赋值,否则这里获取到的是空数组 父组件: <uploadImg :width="200" :height="...<em>方法</em>二: 通过ref属性,父组件调用子组件的<em>方法</em>,把要<em>传</em>的数组作为参数传给子组件,子组件获取该参数,并使用 父组件: this....见子组件向父组件<em>传</em>值
Kotlin 在语言层面支持了委托,这一篇结合实例介绍一下 Kotlin 的委托。...Kotlin 的装饰者模式 装饰者模式和继承拥有相同的目的,都是为了扩展类,只不过它运用了更复杂的方式通:继承 + 组合。装饰者模式在复用原有类型和行为的基础上为其扩展功能。...name()和cost()在复用行为的基础上追加了新的功能,而type()直接将实现委托给了accessory。...test, kProperty) val test.str = str // 等价于 test.delegate.setValue(test, Kproperty, str) 委托应用 更简便地获取传参...: "" } } 获取传递给 Activity 或 Fragment 值的代码就很模板。
在 Java 里,如果你有一个 a 方法需要调用另一个 b 方法,你在里面调用就可以; int a() { return b(1); } a(); 而如果你想在 a 调用时动态设置 b 方法的参数...的内部把参数传给 b: int a(int param) { return b(param); } a(1); // 内部调用 b(1) a(2); // 内部调用 b(2) 这都可以做到,不过……如果我想动态设置的不是方法参数...,我希望可以动态设置: int a(???...但是只有这样写,调用的人才知道应该传一个怎样的函数类型的参数给你。...,但你照着同样的写法写一个 Kotlin 的接口,你却不能传 Lambda。
首先熟悉Kotlin语言的童鞋应该都知道Kotlin函数参数是使用 Pascal 表示法定义(name: type), 因此sum2: 后面的这一坨代表的是一种类型type,那具体代表的是什么类型呢?...在Kotlin中一切皆对象,包括函数也是对象,既然是对象, 同Integer, String等对象一样,一个函数也有自己的类型type (x: Int, j: Int) – Int这种表述方式就是表达函数的类型...答案见1楼 Lambda传递使用 在我们需要使用这两个Lambda表达式的时候可以直接将sum1、sum2传递给一个高阶函数(稍后讲解),或者也可以直接将=之后的表达式传递给高阶函数, 具体如下所示:...最后这个高阶函数自己的返回类型是Int值 使用高阶函数 定义好了一个高阶函数之后,我们就可以将一个Lambda传递给这个高阶函数,完整实例如下所示: fun highOrderFunc(arg1: Int...,设置点击监听器,并将imageClick传进去, // 最终点击ImageView时,会调用viewClicked方法 view.setOnClickListener(imageClick
不支持传参构造单例。 object:伴生对象 Kotlin 当中没有 static 关键字,所以我们没有办法直接定义静态方法和静态变量。...将函数的“参数类型”和“返回值类型”抽象出来后,加上(),->符号加工后,就得到了“函数类型”。...因此,可以将函数引用传递给其他函数,并在需要时执行。...通过 SAM 转换, Kotlin 可以将 签名与接口的单个抽象方法的签名匹配的任何 lambda 表达式,转换成实现该接口的类的实例。...} 图片 普通函数,参数是函数式接口对象,传 函数类型对象 也是可以的 反过来不可以: 高阶函数, 参数是函数类型对象,传 是函数式接口对象 是不可以的。 前面说的都是函数传不同的参数类型。
,支持获取/配置路由替换规则 匹配所有的路由跳转规则,命中规则的,替换成新的目标路由地址 将实际跳转目标地址传递给路由组件执行实际的跳转行为 ?...实际代码实现中,我们将“路由规则”和“路由替换行为”分别抽象成实体类和接口方法。...这里需要注意的是,由于 Intent 传值存在多种复杂的数据接口,包括 Parcelable 这种复杂参数的场景,由于降级之后都是以 URL 的形式传值,所以我们目前约定动态路由的参数只支持基本数据类型...参数处理我们分两个典型的场景来讨论: 原生跳转 H5 参数传递 H5 跳转原生的参数传递 1.4.1 原生跳转H5 这里的方式主要是将 Intent 中的基本数值类型参数取出来,拼接成带参数的 URL...我们目前解决方案也很简单,就是封装 Intent 的取值方法,由于目前有赞 Android 主要使用 Kotlin 来开发,可以使用 Kotlin 的扩展函数特性来实现(Java 可以使用工具类的方式)
我们如果定义类和接口等,针对传入的数据不确定类型的。统一叫做泛型,通过泛型来实现数据类型的动态化。 使用泛型可以最大限度的重用代码,并且保护数据类型的安全以及提高性能。...两种约束方法: class Demo { companion object zinyan { fun isEquals(a: T, b: Z): Boolean...val s = Demo.zinyan.isEquals("12", "213"); //约定为String 但是传值为int 就会报错了 var s1 =...Demo.zinyan.isEquals(12, 23); } 上面这种是我们接口约束的方法,还有一种情况就是在定义函数的时候,约定传值只能是指定的类以及其父类才行。...只是将这个类的大量函数统一约束指定的泛型而已。 class Zinyan { var zin: T? = null fun test1(s: String): T?
方法声明 方法参数 方法用法 在Java中对象是一等公民,而在Kotlin中方法式一等公民。...for (char in str) { result.append(char) } return result.toString() } 允许将可变数量的参数传递给方法...,则通过在括号外部传一个 lambda。...当我们调用 vararg 方法时,我们可以一个接一个地传参,例如 append('h', 'e', 'l', 'l', 'o'),或者,如果我们已经有一个数组并希望将其内容传给该方法,我们使用伸展(spread..., 参数名 : (参数1 : 类型,参数2 : 类型, ... ) -> 表达式返回类型){ ... } Lambda实践 如何使用it 认识it it并不是Kotlin中的一个关键字(保留字
Glide加载动态图片 首先我们先要去依赖一个githup:bumptech:glide:glide:3.7.0包; 使用Glide结合列表的样式进行图片加载: 1) 如果使用的是ListView,...com.github.bumptech.glide:volley-integration:1.3.1@aar' compile 'com.mcxiaoke.volley:library:1.0.8' } 好了,以上就是Glide动态加载图片的方法...,下面开始本文的正文: 需求 Glide下载图片并切圆角或圆形,但图片有大有小,图片不能改变,切圆还好说,但是切圆角就会发现图片小的会比图片大的要圆 搜一下 ” Glide动态加载圆形图片跟圆角图片...” 就会出现很多文章,但这些都不能解决上面的问题 怎样能 Glide动态加载不同大小的图片切圆形图片跟圆角图片呢?...解决很简单 既然是图片大小不一致而导致图片切出来不一样,那就把图片变的一样大小不就可以吗 申明一下我的代码也是在Glide动态加载圆形图片跟圆角图片搜出来的代码基础上修改的.
中,函数也可以当做变量传参,例如: fun funAsArg(args:()->Int){} // 调用 funAsArg { 2 } args 是变量名,它的类型就是函数,函数形式在变量名后面约定...而 invoke 变量是作为参数传递给 exec 函数的,如果 exec 函数为空,那么 inkoke 具体实现的 show 方法也不会被调用的,在 exec 中调用 invoke 的方法如下: fun...// 两种调用形式 // 类似于 ReceiceObject 拓展函数一样的调用 receObj.invoke() // 把 ReceiceObject 作为参数传递给...,返回的是 R 类型,T 和 R 可以相同。...,所以可以在 block 里面调用 T 类型的方法,但不能通过 this 来指代 T 了,通过 it 来指代 T 类型。
平常都没注意python是如何将属性和方法设置成私有的,今天看到了就记一下。 要想将属性和方法设置成私有的,只需要在属性前面或者方法前面加上__(注意,是双下划线)。...printStudent(self): print("姓名是:",self.name) print("年龄是:",self.age) stu = Student("tom",12) #当将printStudent...设置成私有的方法时 #再去在类外访问该方法就会报错 stu.printStudent() 但是呢,在Python中是没有真正意义上的私有属性和方法的,为什么这么说呢?...因为在给属性或方法命名时,实际上是对名称进行了一些特殊的处理,使得外界无法访问。 我们可以使用以下方法来获取私有的属性和方法: stu...._Student__printStudent() 即实例化的对象.单下划线+类名+方法名。
Kotlin有类型推断功能, 不必像Java一样在声明变量前必须指定冗长的类型名称。 图中标注的val关键字表示变量一但被赋值后就不能被修改,跟其它语言中的常量含意相同。...这种声明变量的方式看似与JavaScript非常相似,但作用完全不同, JavaScript是动态类型语言, 声明的变量除非到了运行期,否则无法确定类型,这也就意味着无法通过编译器除错。...而kotlin的这种写法则意味着语言具备类型推断功能, 定义变量看似无法确定类型, 但是假如你想访问变量类型中不存的成员时,则编译时会报错, 实质上它是把原本在变量前面的类型名称给隐藏起来了,但作用不变...五 Kotlin支持if表达式 ? 这种写法对简化代码和提高编码效率意义重大。 六 ? 支持data class, 而不必像在Java为了定义一个数据实体而写一堆getXXX 和 setXXX方法。...并且在传参时可以指定参数名称。 而在kotlin中声明的数据类, 在Java中使用时会自动生成一堆getXXX和setXXX方法 ?
将Java自动转换为Kotlin,JetBrains将IntelliJ集成了一个新功能,将Java转换为Kotlin,节省了大量的时间。而且它也节省了我们重新编写代码。...Kotlin的空安全性很好,现在摆脱NullPointerExceptions。这种类型的系统帮助我们避免空指针异常。...Kotlin用Any表示Java中的Object Kotlin没有new关键字,直接赋值即可 Kotlin把函数当参数传,和js一样 Java中强制转换:(int)mHeader,Kotlin中mHeader...as Int 继承、重写、接口等关键字写法不同 循环写法不同,Kotlin更简单直观 Kotlin实体类对象不需要写get/set方法 ......小技巧 如果不知道Kotlin怎么写时,可以写一个Java的,然后用Idea的Java代码转Kotlin功能转换一下 Kotlin的传参写法:str: String,名字在前,类型在后 ... ----
没错,为了照顾到这一点,又不让类型系统出错, Kotlin 选择将 person::class 的类型置为 KClass 来解决问题。...其实 Java 也有类似的操作,请看文章:Java中getClass方法的返回值类型 person::class 相当于 Java 的 person.getClass(),尽管这个方法的签名是这样的:...extends String> c = "".getClass(); 不过 Java 毕竟与 Kotlin 不一样,它的反射传参要求非常简单,没有严格的类型限制,只要是 Object 就照单全收: Method.java...不知道大家怎么看这件事儿,kotlin 对象获取 KClass 实例的方法其实不止 person::class 这样一种,还有一种叫做:this.javaClass.kotlin ,这货的类型是 KClass...这个故事呢,你说 Kotlin 事儿多也行,说它严谨也行,反正,解决方案咱都有,大不了,大不了我去天桥上贴膜。。什么破代码,不写了! 关注公众号 Kotlin ,获取最新的 Kotlin 动态。
Kotlin 高阶函数概念 II . Kotlin 高阶函数 作为 参数 示例解析 ( forEach 方法参数解析 ) III ....Kotlin 高阶函数概念 ---- Kotlin 高阶函数 : Kotlin 的高阶函数 , 就是方法的参数 或 返回值 是函数类型的 函数 ; 如 : List 集合的 forEach( ) 循环...函数类型变量 : 可以使用匿名函数 , 赋值给一个变量 , 然后将这个变量当做参数传递给 forEach 当做参数 ; ① 指定变量 : 为 (String) -> Unit 类型函数指定一个引用变量...空类型 这个函数是 (String) -> Unit 类型的 但是不能直接将 study 传入到 forEach 方法中 , 当做参数 */ fun study(student : String..., 可以直接传递给 forEach 方法当做参数使用 函数名省略 : 将一个函数赋值给一个变量 , 此时函数不能有名称 , 必须是匿名的 ; 该函数可以直接通过 study2("111
Kotlin数据类型 在Kotlin之中,没有所谓的基本数据类型.也就是说可以将Kotlin的数据全部理解成java之中的对象....关键字进行标注,其次函数的传参是参数在类型的前面....具体的传参类型和java是一样的. 还有一个区别在于,返回值,写在了函数的最后....也可以将区间理解为范围 实例1: package cn.zinyan.key class Demo() { //带返回值和传参的函数 ,返回值为Int fun test1(a: Int...实例: var v:Int = 1 var i:Long =v //错误 var i:Long = v.toLong() //正确的写法 在Kotlin之中,所有的数据类型都有下面的这几种转换方法
有些特定需求, 比如说搜索引擎, 很多人都要求时间必须是时间戳. 所以, 我们把时间转成最原始的Long型. Gson默认的是不支持的, 需要手动处理一下.
领取专属 10元无门槛券
手把手带您无忧上云