1.3 ViewBinding 的实现原理 AGP 插件会为每个 XML 布局文件创建一个绑定类文件 xxxBinding ,绑定类中会持有布局文件中所有带 android:id 属性的 View 引用...例如,有布局文件为 fragment_test.xml ,则插件会生成绑定类 FragmentTestBinding.java 。...那么,所有 XML 布局文件都生成 Java 类,会不会导致包体积瞬间增大?不会的, 未使用的类会在混淆时被压缩。 ---- 2....那么,有没有可优化的方案呢?我们想起了 Kotlin 属性委托,关于 Kotlin 委托机制在我之前的一篇文章里讨论过:Kotlin | 委托机制 & 原理[7]。...总结 ViewBinding 是一个轻量级的视图绑定方案,Android Gradle 插件会为每个 XML 布局文件创建一个绑定类。
幸运的是,现在科特林提供了一个 kotlin-spring 插件,一个预配置版本kotlin-allopen的插件,自动打开了注解的类型或元注解与以下注释的一个类及其成员函数: @Component @...幸运的是,现在这个解决办法 “默认构造函数地狱” ,因为科特林提供了科特林,JPA 插件,它生成与JPA注解类合成的无参数的构造函数。...注释阵列属性 Kotlin注释大部分与Java类似,但是在Spring中广泛使用的数组属性 - 行为不同。...在Java中,有可能指定注释阵列属性一个单一的值,它将被自动转换成一个数组。...虽然这是完全合法的Groovy中,它是(可以说)一个不好的做法:在一个一致的方法的利益,你应该(在笔者的意见)尊重每个源文件中的一个(public)类标准Java约定。
结合以上情况开始针对编译速度进行优化,在优化前很有必须先了解下编译的过程是怎样?哪块的编译拉低了我们整个编译流程。 编译流程 ?...raw:这类资源以任意格式的文件保存在res/raw目录下,它们和assets类资源一样,都是原装不动地打包在apk文件中的,不过它们会被赋予资源ID,这样我们就可以在程序中通过ID来访问它们。...,例如,数组、颜色、尺寸、字符串和样式值等,一般来说,这六种不同的值分别保存在名称为arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml文件中。...所有没有编译的资源(如 res/raw、images等)、Other Resources(assets文件)、编译过的资源 、.dex文件 、resources.arsc 和 AndroidManifest.xml...=true kotlin.parallel.tasks.in.project=true 使用静态依赖项版本 在 build.gradle 文件中声明依赖项时,您应当避免在结尾处使用带加号的版本号,例如
如果函数没有返回值,则可以返回Unit,或者什么都不反回,如: fun add(a: Int, b: Int) { a + b } 3、注释 Kotlin中的注释与Java中的注释一样,也有单行注释和块注释...// 表示大那行注释 /* */ 表示块注释 Kotlin块注释还支持嵌套: /* hello /* world */ */ 基础数据类型 在Kotlin中,一切都是对象。...在Kotlin中定义数组的方法有很多,使用arrayOf()函数定义可以存储任意值的数组;使用arrayOfNulls函数定义指定长度的空数组(数组元素中没有值);使用Array类的构造器指定数组长度和初始化数据的方式定义数组...的包仅仅是为了引用文件中的资源而设计的,先看段代码: package com.example.kotlin fun adtion() {} class MyClass {} 上面代码中,定义了一个函数和一个类...那么在其他的Kotlin文件中,若想使用adtion方法或者MyClass类,直接调用com.example.kotlin.adtion和com.example.kotlin.MyClass。
Binding类,Binding类的命名规则是将xml文件按驼峰方式重命名后,再加上Binding作为结尾得到的,例如splash_layout.xml会自动生成一个SplashLayoutBinding...的类文件。...ignore 如果你不想生成这个Binding类,可以通过下面的方式来过滤掉该文件的生成。...其实没什么区别,这是为了在Kotlin中将不可空类型置空的一种妥协方式,同样的代码逻辑,在Java中,就会非常简单了。...另外一种方式是直接使用新的Binding文件,因为所有的xml布局文件都会生成Binding,所以可以直接使用这个Binding文件。
个人感觉XML配置文件相对直观,后文会花大量篇幅去说明XML配置文件中的配置项及其作用。这里先注意一点:默认的配置文件为ClassPath:generatorConfig.xml。...false suppressDate 是否在注释中添加生成的时间戳 false dateFormat 配合suppressDate使用,指定输出时间戳的格式 java.util.Date#toString...XMLMAPPER:Mapper接口生成接口方法,对应的实现代码生成在XML映射文件中(也就是纯映射文件实现)。...MIXEDMAPPER:Mapper接口生成的时候复杂的方法实现生成在XML映射文件中,而简单的实现通过注解和SqlProviders实现(也就是注解和映射文件混合实现)。...false - rootClass 如果配置此属性,则实体类会继承此指定的超类 - 如果有主键属性会把主键属性在超类生成 rootInterface 如果配置此属性,则实体类会实现此指定的接口 - 执行引擎为
1、Hello, Kotlin 1.1 Kotlin的身世 写了许久 Java,有没有发现其实你写了太多冗余的代码? 后来你体验了一下 Python,有没有觉得不写分号的感觉真是超级爽?...接下来我们用 Android Studio 创建一个 Android 工程,比如叫做 HelloKotlin,在 app 目录下面的 build.gradle 文件中添加下面的配置: ?...在扩展成员当中,只能访问被扩展类在当前作用域内可见的成员,本例中的x 和 y 都是 public 的(Kotlin 默认 public,这个我们后面会提到),所以可以在扩展方法和属性中直接访问。...因为这段代码是 inline 的,最终编译时是要编译到调用它的代码块中,这时候T的类型实际上是确定的,因而 Kotlin 通过 reified 这个关键字告诉编译器,T 这个参数可不只是个摆设,我要把它当实际类型来用呢...不过用 Kotlin 的 Android 扩展插件,我们就可以这样: 先上布局文件: main.xml ? 在 Activity 中: ?
,还可以是一个代码块,在块中通过 yield 来指定返回值。...类似于 Kotlin 的智能转换,但语法不同,在 Scala 中没有直接对应。...(通常译为“本地方法”,按说应该叫“原生方法”) 除了这些限制之外,它与普通类一致: 用 new 实例化 可以在顶层声明,也可以在类内部、局部作用域中声明 可以声明静态方法与实例方法 可以声明静态字段与静态初始化块...permits 显式声明其直接子类型列表,也可以省略——编译器会根据当前文件中的直接子类型的声明推断出来。...小结 Java 12-15 引入了 switch 表达式、文本块、instanceof 模式匹配、记录、密封类型这几个语言新特性,这些特性在 Kotlin/Scala 中基本上都有对应,如同 Java
当然,如果你仍然想要写Kotlin风格的 activity类,并且inflate XML布局,可以使用View属性,这样可以更简单: // Same as findViewById() but simpler...我们将以块的方式来引用这些方法。 在Android framework中,块在几乎所有View中都存在,它们可以工作在Activities,Fragments甚至是Context。...在频繁使用的View中,比如TextView,EditText,Button或者ImageView中,这种代码块经常存在。...中,你可以在描述好了View之后使用lparams()来指定View的LayoutParams linearLayout { button("Login") { textSize...XML到DSl的转换器 这个插件也支持XML布局转换成Anko布局代码。打开XML文件选择 Code -> Convert to Anko Layouts DSL。可以同时转换多个XML布局文件。
1.1 Kotlin的身世 写了许久 Java,有没有发现其实你写了太多冗余的代码? 后来你体验了一下 Python,有没有觉得不写分号的感觉真是超级爽?...接下来我们用 Android Studio 创建一个 Android 工程,比如叫做 HelloKotlin,在 app 目录下面的 build.gradle 文件中添加下面的配置: ?...在扩展成员当中,只能访问被扩展类在当前作用域内可见的成员,本例中的x 和 y 都是 public 的(Kotlin 默认 public,这个我们后面会提到),所以可以在扩展方法和属性中直接访问。...因为这段代码是 inline 的,最终编译时是要编译到调用它的代码块中,这时候T的类型实际上是确定的,因而 Kotlin 通过 reified 这个关键字告诉编译器,T 这个参数可不只是个摆设,我要把它当实际类型来用呢...不过用 Kotlin 的 Android 扩展插件,我们就可以这样: 先上布局文件: main.xml ? 在 Activity 中: ?
业务方不知道哪些 key 是必选的,导致每次都要去看下文档,哪些需要录入 无法知道这么多 key 对应着什么功能,json 里面也无法写注释,导致每次都要去查看文档该 key 表述的是什么意思 那有什么办法解决这些问题呢...既然有 java 文件解析,那一定就有 kotlin 文件解析,google 搜了下,查到了三个库: kotlin-parser[2] : 调研发现有点难用,无法根据注解方法的回调遍历注解参数 kastree...[3]:遍历简单,可以拿到 Node 节点进行向下遍历 kotlinx.ast[4] :大而全的 ast 解析库,适配的规则非常多,但使用起来有点重 在简单了解和 demo 测试中,决定使用 kastree...这个轻量级的库来实现,在 README 的描述中,可以写个简单的伪代码: // 读取 kt 文件内容 val code = File("xx/test.kt").readText() // 生成解析器...在我们解析拿到了内容之后,那接下来的生成 json 文件就更简单了,我们只需给每个待解析的 kt 文件创建个 JSONObject 节点,然后将解析到的信息都 put 进去,如果有多个文件的话,则创建个
settings.gradle 配置文件在主工程中,文件中可以查看其他的配置project build.gradle:project工程配置文件,配置工程依赖编译等信息 tip: 单project...settings.gradle` 配置文件 include ':app' rootProject.name='Demo' 根目录下到gradle配置(Project: Demo)如下(配置的用途见注释...配置如下(用途见注释) // 这里使用的 plugin ,需要在根目录下的gradle中配置引用 apply plugin: 'com.android.application' apply plugin...task 执行过程中被执⾏,在执行阶段(第三阶段)执行,如果用户没有直接或者间接执行task,那这部分的代码块就不会执行 * 2....指定依赖后,task 会在⾃己执⾏前先执⾏⾃己依赖的 task */ android 中可以使用如下命令执行task $ .
:指定输入的源代码文件,采用的规则集文件,输出的报告文件等。...,一种解决办法是,另外配置一个专门用于执行格式化的task,它所指定的规则集只开启 format 类别的规则: // root build.gradle subprojects { apply...第一种方式是使用 @Suppress 注解[12]: 在类名或者方法名前添加诸如 @Suppress("LargeClass") 这样的注解,可以有针对性地忽略这个文件中的某些告警。.../gradew detektBaseline 来生成一个 baseline.xml 基线文件。有了这个基线文件,下次扫描时,就会绕过文件中列出的基线问题,而只提示新增问题。...小结 detekt 为我们提供了一套完整的 Kotlin 代码规范治理方案: 在工程中引入 detekt 工具,可以很方便的对 Kotlin 代码执行静态扫描 对 detekt 提供的规则集进行修改,
MyBatis自动生成Mapper插件,配置完可根据自动生成Dao接口、xml文件、实体类。...resources下 2.pom.xml文件中配置插件 ${project.basedir}/src/main/kotlinxml中先引入mybatis的包 类文件的生成,在进行代码生成器的过程中,生成 selectCountByMap selectListByMap 两种方法,代替 Example 方法的生成 -->...-- 自定义注释部分(实体类entity生成过程中,将配置的数据库部分的注释部分生成,关键节点的注解部分生成) --> <plugin type="com.kecikeci.mybatis.generator.plugin.MyTableAnnotationPlugin
Spring Data MongoDB 使用@Sharded注释来标识存储在分片集合中的实体,如下所示。...在启用了分片的数据库中分片集合。 指定分片键。此示例使用基于范围的分片。 19.2.分片键处理 分片键由一个或多个属性组成,这些属性必须存在于目标集合的每个文档中。它用于跨分片分发文档。...20.1.要求 Spring Data 支持 Kotlin 1.3 并要求kotlin-stdlib(或其变体之一,例如kotlin-stdlib-jdk8)和kotlin-reflect存在于类路径中...而且kotlinx-coroutines-reactor依赖在类路径中: 示例 211....在 Maven pom.xml 中添加的依赖项 org.jetbrains.kotlinx kotlinx-coroutines-core
Kotlin DSL 版本的脚本被称为 "Program",它在 Gradle 的实现当中也通过一个叫 Program 的类及其子类来描述,定义在 Program.kt 文件当中。...classpath 阶段编译运行的代码块都继承自 Stage1 这个类。...而且需要特别注意的是,我们会在 classpath 阶段的 buildscript 代码块中添加 classpath,所以这个阶段与 body 阶段运行时的 classpath 是不一样的,因此不是所有在...classloader 包含了 classpath 阶段添加的依赖,因此在 body 阶段可以访问所有前面 dependencies 当中添加的 maven 依赖库中的类。...2.3 定义在 init.gradle.kts 当中 接下来我们就要考虑,有没有什么办法让我的电脑上所有的工程都能支持这个扩展呢?
hello { println "hello"} Task依赖 单独声明一个task在实际开发中几乎不会有任何的意义,更多的时候是让多个task组合起来,一个依赖另一个,形成一连串的任务集。...setting.gradle文件 关于setting.gradle中也可以写代码,是很多人不知道的。...如下代码是我在上一篇文章【企业级 Android 模块化平台设计建议】中讲到的一个例子,在setting.gradle文件中,可以指定一个project位置,这里就可以将一个外部工程中的模块导入到APP...但实际上有一个非常简单的办法,写一遍就可以了,就是在项目的根gradle文件中的subprojects闭包中声明这个dependencies。...', '**/*.properties') } 本章就讲到这里,下一篇讲如何创建一个Gradle插件,完成编译时向指定类或新生成类中动态添加代码(包括jar包中)。
而生僻、难发音的单词会严重影响交流沟通。 其次是可搜索,我们在IDE中编写代码的时候,经常会用「关键词联想」的方法来自动补全和搜索。...所以,我们要有模块化和抽象思维,善于将大块的复杂逻辑提炼成类或者函数,屏蔽掉细节,让阅读代码的人不至于迷失在细节中,这样能极大地提高代码的可读性。...不过,只有代码逻辑比较复杂的时候,我们其实才建议提炼类或者函数。毕竟如果提炼出的函数只包含两三行代码,在阅读代码的时候,还得跳过去看一下,这样反倒增加了阅读成本。...相对于类和模块,函数的粒度比较小,代码行数少,所以在应用单一职责原则的时候,没有像应用到类或者模块那样模棱两可,能多单一就多单一。 整洁的代码只做好一件事,干脆利落,直接了当,易于阅读,易于维护。...比如: Java的文件名遵循驼峰命名法,而在Flutter中文件名使用下划线隔开; Java和OC是强类型语言,Swift和Kotlin是弱类型语言,不仅有类型推导上的区别,还有一些语法糖的特性; 等等
Kotlin 数据类的属性填充 在 Kotlin 中,默认情况下所有类都是不可变的,并且需要明确的属性声明来定义可变属性。...Kotlin 为每个类中的每个属性生成属性访问器(getter 和 setter)。...如果您id在应用程序中指定了一个值,那么 MongoDB 驱动程序会检测到 ObjectId 的转换。如果指定的id值无法转换为 ObjectId,则该值将按原样存储在文档的 _id 字段中。...如果idJava 类中不存在已命名的字段_id,则驱动程序将生成一个隐式文件,但不会映射到 Java 类的属性或字段。...您可以创建自己的MappingMongoConverter. 这样做可以让您指定在类路径中可以找到域类的位置,以便 Spring Data MongoDB 可以提取元数据并构建索引。
领取专属 10元无门槛券
手把手带您无忧上云