首页
学习
活动
专区
圈层
工具
发布

Kotlin京东业务实战 | 强大又简洁的JVM语言

比如说,如下代码将无法编译通过: var artist: Artist? = null? artist.print() 第2行会显示一个错误,因为没有对变量进行null检查。...默认kotlin中所有的对象都是不为Null的。...Kotlin编译器在目标代码生成环节做了很多类似于Java封装的事情,比如自动生成Getter/Setter代码的生成、Companion转变成静态类、修改类属性为final不可继承(open修饰即可继承...Kotlin在设计上避免了常见的编程错误,从而减少了应用程序崩溃和系统故障。此外,由于Kotlin 是快速失败机制,可以立即报告任何可能导致失败的问题。...>>>> 常见问题 环境配置出错,出现无法编译或编译正常但apk中无kotlin代码,运行时报kotlin代码找不到; 解决方法:在插件代码中配置kotlin环境,在gradle中增加classpath

1.9K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【错误记录】Android 编译时技术报错 ( 注解处理器 process 方法多次调用问题 )

    文章目录 一、报错信息 二、问题分析 三、解决方案 注解处理器 AbstractProcessor 中的 process 方法可能会调用多次 , 在生成代码时 , 一定要注意 , 检测到 注解节点 后再生成代码...; 一、报错信息 ---- Android 编译时技术 , 使用注解处理器生成代码 , 编译时报如下错误 : ( 该错误不会中断编译 ) javax.annotation.processing.FilerException..., 使用 JavaPoet 生成 Java 代码 ; 上述 process 方法应该是调用 3 次 , 调用第一次时生成了 com.example.helloworld.HelloWorld 源码 ,...for type com.example.helloworld.HelloWorld " 错误 ; 三、解决方案 ---- AbstractProcessor 中的 process 方法调用了 3...extends TypeElement> set 注解参数不为空 , 这里检测到注解后 , 再生成 Java 代码即可 ; 修改后的源代码如下 : package kim.hsl.router_compiler

    1K20

    【Android 组件化】路由组件 ( 构造路由表中的路由信息 )

    实现组件化 ( Gradle 变量定义与使用 ) 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 ) 【Android 组件化】使用 Gradle 实现组件化 (...) 博客中在注解处理器中 , 获取了在 build.gradle 中设置的参数 ; 本篇博客中讲解 " 注解处理器 " 后续开发 , 生成路由表中的 路由信息 ; 一、封装路由信息 ---- 在 "...---- 1、Activity 中使用 @Route 注解 下面开始开发 AbstractProcessor 注解处理器中的 process 方法 , 在该方法中生成 Java 代码 ; 在 MainActivity...process 方法中 , 首先判定解析到了 注解节点 , 如果没有解析到注解节点 , 就立刻退出 , 参考之前出现的问题 【错误记录】Android 编译时技术报错 ( 注解处理器 process 方法多次调用问题...注解节点 获取被 Route 注解标注的类节点 , 调用 RoundEnvironment 参数的 getElementsAnnotatedWith 方法 , 传入要获取的注解类对象 ; // 获取被

    81020

    编写 Android Library 的最佳实践

    伴生对象里需要暴露的 api 请打上 @JvmStatic 已经在写 Kotlin 的小伙伴应该都清楚,Kotlin 的“静态方法”、“静态常量”是靠“伴生对象”来实现的。...image.png 然后打开 library 的 build.gradle, 在 defaultConfig 闭包里调用 consumerProguardFiles() 方法: defaultConfig...而接入者的项目原可能已经依赖了这些库,一旦再接入了你的,就会导致错误,提示 duplicated class was found。 这种做法与 Gradle 的依赖管理机制完全是背道而驰的。...不要让你的调用者费劲心思去找应该实例化哪个类,反正所有的方法都在这一个类里面,拿到实例之后调用对应的方法即可。这样统一入口,既降低了维护成本,你的调用者也会感谢你。...,请检查参数" ... } } 这样一写,你的调用者只要点点鼠标,进来看一下你这个类,就能迅速把错误码跟错误提示对应上。

    1.4K01

    Kotlin —— 这次入门就不用放弃了

    而Kotlin是空安全的,我们通过一个安全调用操作符?来明确地指定一个对象是否能为空。 我们可以像这样去写: // 这里不能通过编译....list.map( println(it) //it表示迭代的对象 ) 查看源码,我们可以看到实际上map就是一个扩展方法,给所有可以迭代的集合提供该方法,map方法接收的参数是一个lambda表达式...调用方法的时候,我们需要传入想要转成的类的Class。我们都知道Java的泛型实际上是伪泛型,对泛型支持的底层实现采用的是类型擦除的方式(只有在编译期才有)。...每一个public的 val 变量都会生成一个「支持域」和一个能被 Java 调用的 getter 方法。每一个public的 var 变量都会生成 getter 和 setter 方法。...庆幸的是,私有属性的 getters 和 setters 会生成域而不是生成方法。

    1.9K30

    《Android群英传 神兵利器》读书笔记

    《Android群英传 神兵利器》 - Android开发的工具使用 这是一本Android开发的工具书,里面的提到的工具基本上是每个Android开发者必备的技能,买这本书的起因是看到有介绍Gradle...在清单文件创建占位符 -> 配脚本 -> 生成重命名包(注意AS3.0变化) 系统有一个BuildConfig类文件,是无法改变值的。...Task依赖:增加一个依赖方法,连接起来,让不在一起的Task能够有一个先后执行的关系。...Lint 用于检测各项目中(包含库)中的一些错误问题,比如资源未用或过时的api等。 在AS命令行使用gradle lint。...JNI:jni相关调用的引用、变量、参数。 Thread:活着的线程。 Stack:栈中的对象。 静态:方法区类的静态属性引用的对象。 常量:方法区中的常量引用的对象(final类型)。

    66010

    配置Android项目 - 静态代码分析工具

    在Android上,最流行的代码分析工具是: Lint PMD Findbugs 我通常将静态代码分析脚本和相关文件保存在单独的文件夹中。...htmlOutput —html报告生成的地方。 将script-lint.gradle导入到build.gradle文件。 ? 测试 重新构建你的项目,然后使用....source —源代码的路径 html.destination —html报告生成的路径 将script-findbugs.gradle导入到build.gradle文件。 ?...它发现常见的编程缺陷,如未使用的变量,空catch块,不必要的对象创建等等。 配置 要添加pmd到你的android项目那么需要创建script-pmd.gradle文件。 ?...source —源代码的路径 html.destination —html报告生成的路径 将脚本script-pmd.gradle导入到build.gradle文件。 ?

    81020

    是时候使用Kotlin编程了

    并吸收了其他语言的优点:模板字符串,运算符重载,方法扩展,命名参数等。 2,安全性 Kotlin提供了安全符“?”,当变量可以为null时,必须使用可空安全符?进行声明,否则会出现编译错误。...而当在Java代码中调用Kotlin对象时,Kotlin生成的class文件也要输入到Java编译器,这时Java文件才能生成正确的class文件。...伴生对象的调用跟Java一样,通过类名.属性名称或函数名称调用。 新特性 1,空安全 在Kotlin中,对象声明分为可空引用和非空引用两种。...,这种动态获取信息以及动态调用对象方法的功能特性被称为反射机制。...Kotlin中的反射如下。 要调用具体的对象时,可以不通过KClass对象,直接调用方法和访问属性。

    3.6K10

    Gradle初探

    -q 控制gradle输出的日志级别。 Groovy将println()添加java.lang.Object,方法调用可以省略括号,以空格分开,单引号双引号包含内容都是字符串。...gradle wrapper 自动生成Wrapper所需要的目录文件。 gradlew和gradlew.bat是Linux和Windows下的可执行脚本。...-S 或 --full-stacktrace 输出全部堆栈信息 使用日志信息调试:其实是调用Project的getLogger获取Logger对象的实例。...闭包委托 Delegate Groovy闭包支持闭包方法的委托。闭包有thisObject、owner、delegate三个属性。 this: 该属性指向定义闭包的类的实例对象。...delegate: 该值初始化时是和 owner 相同的,但是该值可以通过接口将其它对象赋值给 delegate,来实现方法的委托功能。

    75720

    Gradle-Groovy语法

    所在的类,而 owner 表示的定义所在的类或闭包(最近原则) 三个属性已经很明白了吧, 委托策略 无论什么时候在闭包中访问某属性或调用某方法时,若没有明确的设置对象,那么就会调用一个委托策略。...运算符 这里只列出来和 Java 不同且常用的运算符 可空运算符 对象非空时使用对象本身,对象为空时使用给定值;常用于给定某个可空变量的默认值。...Task :operator name is 佛系编码 , age is 12 BUILD SUCCESSFUL in 0s 1 actionable task: 1 executed 安全导航运算符 当调用一个对象上的属性或方法时...,如果对象是空的,就会抛出空异常,这个使用 ?....运算符,当对象为空时,表达式的值也是空,就不会抛出异常。

    1.7K10

    【Android 组件化】路由组件 ( 组件间共享的服务 )

    】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 ) 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 ) 【Android 组件化】使用 Gradle...: 跨组件调用时 , 需要暴露出一个接口 , 接口必须实现上述 IService 接口 , 用于作为标识 , 注解处理器中 , 通过判断该注解节点的类型是不是该接口的子类 , 如果是则生成 路由信息...组件都要依赖的 Android Library Module 依赖库 ; 在其中定义一个接口 ComponentService , 继承 IService 接口 , 在该接口中定义一系列需要暴露的方法...StringService 服务 "); } } 该类定义位置 : 在任意模块都可以调用该类 ; 二、注解处理器添加对上述 " 组件间共享的服务 " 的支持 ---- 之前在注解处理器中..."); } 三、注解处理器 生成代码规则 ---- 注解处理器的 process 方法调用 , 是按照 Module 模块进行的 ; 如果 Module 模块中有相关注解 , 传入的 Set<?

    1.1K10

    前端开发者的 Kotlin 之旅:kotlin核心概念解析

    例如,处理异步数据时,Kotlin 的map/filter等操作符支持类型推断,避免 JS 中常见的类型错误: // 高阶函数示例:接受函数作为参数 fun processNumbers(numbers...: 0 // 安全调用+空值合并,等价JS的`str?.length ?? 0` 前端对比:JS 的null/undefined需运行时判断(如if (str !...(安全调用)、!!(非空断言)、?:(空值合并)实现编译时校验,大幅提升代码健壮性。 3....() // 调用:"Kotlin".reverse() // "niltKo" 前端应用:为 HTML 元素添加类型安全的操作方法,替代 JS 的prototype污染: fun HTMLDivElement.setTextColor...Gradle 构建 Gradle 是 Kotlin 项目的默认构建工具,通过 Kotlin DSL(build.gradle.kts)实现类型安全的配置。

    48110

    Gradle入门基础一

    init.gradle文件会在每个项目 build 之前被调用,用于做一些初始化的操作,它主要有如下作用: 配置内部的仓库信息(如公司的 maven 仓库信息); 配置一些全局属性; 配置用户名及密码信息...然后 Gradle 会为每个带有 build.gradle 脚本文件的工程构建一个与之对应的 Project 对象。...Task 对象的集合。...action,还是添加的doLast、doFirst 方法,其实底层都被放入到一个Action 的List 中了,最初这个 action List 是空的,当我们设置了 action【任务自身的行为】,...gradle 默认各指令之间相互的依赖关系: 图中相关命令的解释: task的定义方式 一种是通过 Project 中的task()方法,另一种是通过tasks 对象的 create 或者register

    45010

    Android Studio安装、配置史上最全图解

    3.指定创建一个空Activity ? 4.完成配置并去创建Project ? 5.创建生成相关数据的过程(要一些时间) ? 6.进入AS工作界面 ? 7.AS工作界面整体结构 ?...这里用户可以将解压后生成的目录下.gradle删掉,改为自己解压的.gradle。因为内部包含了Junit等jar包。 ? ?...4.再次回到主窗体中的project视图,在要删除的模块上右键 ? 5.在弹出的对话框中点击Delete,这样在项目中就将module模块删除了 ?...+/ 抽取方法(Extract Method) Alt+shift+Q 局部变量抽取为成员变量(Introduce Field) Alt+shift+F 查找方法在哪有被调用(Call Hierarchy...1、代码定位到程序当前执行处 2、单步跳过 3、跳入方法 4、跳出当前方法 5、执行完当前断点区域, 进入下一个断点(或结束) 6、中断程序 7、断点管理按钮 8、显示方法调用流程 9、

    4.2K50

    货拉拉 Android 模块化路由框架:TheRouter

    二、路由方案目前现有的路由基本上集中于两种能力的实现:页面跳转、跨模块调用,核心技术方案大体上如图: 图片 开发阶段,对要使用路由的落地页或被调用方法添加注解标识。...编译期解析注解,生成一系列中间代码,待调用。应用启动后调用中间代码完成路由的准备动作。大部分路由会额外通过 Gradle Transform,在编译期做一次聚合,以提升运行时准备路由表的效率。...发起路由跳转时,本质上就是一次路由表遍历,通过uri获取到对应的落地页或方法对象,进行调用。 TheRouter 的页面跳转、跨模块调用也是如此,但是在设计上会有一些细节处理。...// 不建议每次都请求网络,否则请求网络的过程中,路由表是空的,可能造成APP无法跳转页面 // 最好是优先加载本地,然后开异步线程加载远端配置 String...5.3 实现原理每个加了 @FlowTask 注解的方法,都会在编译期被解析,生成一个对应的 Task 对象,这个对象包含了初始化方法的相关信息,比如:是否异步执行、任务名、是否依赖其他任务先执行。

    2.2K40

    byte转File一次看个够

    需求背景 当你需要将byte[]、MultipartFile、File实现互转时,无外乎以下场景: 保存第三方接口返回二进制流 前/后端文件流上传 微服务间调用 文件格式转换 正如你所需要的,通过搜索引擎筛选到我的本篇文章是因为你在开发中需要将...虽然MockMultipartFile实现了MultipartFile接口,重点在于后一句对其作用的描述:用于测试访问分段上传, 所以这个类在正式环境是无法使用的,在我看来使用MockMultipartFile...", e); throw new CustomException("转换过程中发生错误", e); } } byte[]转File byte[]转File的实现方式更多一些,很多第三方高质量的轮子提供了均对应的方法...,无需自行实现,调用API即可,下文以HuTool``与Apache Commons lang3举例。...MultipartFile转File MultipartFile接口提供了getInputStream()方法,你可以使用这个方法来读取文件内容,并将它们写入到一个新的File对象中。

    1K20

    Gradle 学习 ----Gradle 与Idea整合

    Groovy中基本类型也是对象,可以直接调用对象的方法。 支持DSL(DomainSpecificLanguages领域特定语言)和其它简洁的语法,让代码变得易于阅读和维护。...,def支持动态类型声明 2.单行注释:// 多行注释: /** 3.gradle语句最后的;(分号)是可以省略的 4.groovy可以为属性自动生成getter、setter方法 5....读取属性值: 方式1: 对象.属性名 方式2: 对象[“属性名”] 方式3: 对象.属性getter方法() 2. 4. 1 、案例 1 :基本注意点 提示:方法调用时,在不含有歧义的地方可以省略方法调用时的括号...,可以调用对象的方法 println(num1.getClass().toString()) println(str1.getClass().toString()) println(str2.getClass...,可以调用对象的方法 println(str1.getClass().toString()) println(str2.getClass().toString()) println(str3.getClass

    92300
    领券