KClass 类型,KClass 的一个实例表示对 Kotlin 类的引用。...KClass 也是 Kotlin 反射 API 的主要入口。 在 Kotlin 中,字节码对应的类也是 kotlin.reflect.KClass。...Kotlin 的引用类有两种方式:类名::class和对象::class,它们获取的都是相同的 KClass 实例。 即处于同一个类加载器中,给定的类型只能返回一个 KClass 实例。...获取类的构造函数 Kotlin 在获取 KClass 实例之后,可以获取它的全部构造函数。...局部类所属范围:在块、构造器以及方法内,这里的块包括普通块和静态块。
一、:: 双冒号操作符 ---- 在 Kotlin 中 , :: 双冒号操作符 的作用是 获取 类 , 对象 , 函数 , 属性 的 类型对象 引用 ; 获取的这些引用 , 并不常用 , 都是在 Kotlin...} 2、获取对象类型的引用 在 Kotlin 中 , 使用 :: 双冒号操作符 获取 对象类型的引用 代码格式为 : Java或Kotlin实例对象::class 获取的 对象类型的引用 的类型 为 KClass...---- KClass 是 Kotlin 类的 引用类型 , 是 Kotlin 类的实例对象 , 通过 类名::class 可以获取 KClass 引用 ; KClass 提供了关于 Kotlin 类的一系列功能..., 包括 : 获取类的简单名称 获取类的完整名称 创建类的实例对象 获取类的成员字段和方法 获取类的继承关系 KClass 的全类名是 kotlin.reflect.KClass , Class 的全类名是...注解 获取类的 继承关系 获取类的 成员字段和方法 代码示例 : import kotlin.reflect.KClass import kotlin.reflect.KProperty0 import
val person: Any = Person("Benny", 30) 对于这样的情况,person::class 如果返回的是 KClass,那么在后续的反射访问属性的操作中,我们将什么都得不到...不知道大家怎么看这件事儿,kotlin 对象获取 KClass 实例的方法其实不止 person::class 这样一种,还有一种叫做:this.javaClass.kotlin ,这货的类型是 KClass...我当时就惊呆了,还以为这两种获取 KClass 的方式有什么重大差别呢,结果跟了下源码,是的,this::class 这种写法在调试的时候也是可以强制跳入调用栈的(反编译看字节码也可以),二位居然都是调用了下面的方法来获取...Kotlin 调用处做了一次类型强转,一个强转成了 KClass,一个强转成了 KClass 。。。...这个故事呢,你说 Kotlin 事儿多也行,说它严谨也行,反正,解决方案咱都有,大不了,大不了我去天桥上贴膜。。什么破代码,不写了! 关注公众号 Kotlin ,获取最新的 Kotlin 动态。
12.2 注解 Kotlin的注解跟Java注解也完全兼容。我们可以在Kotlin代码中很自然地使用Java中的注解。...使用 ::class 来获取sword对象实例的 KClass 类的引用 val kClass = sword::class 上面的这行代码,Kotlin编译器会自动推断出kClass变量的类型是 val...Kotlin中的函数和属性也是头等公民,我们可以通过反射来内省属性和函数:如运行时属性名或类型,函数名或类型等。 在Kotlin中我们有两种方式来实现反射的功能。...在Kotlin中可以直接引用digitRegex对象实例的matches方法。...另外,我们所说的 Java 泛型在字节码中会被擦除,并不总是擦除为 Object 类型,而是擦除到上限类型。 在Kotlin也是一样的泛型机制。
Jackson在Kotlin下全局自定义序列化器Long转String不生效 起因 雪花算法生成的主键传到前段后发生精度丢失,例如后端传入1397844263642378242,前端接收后变成1397844263642378000...ToStringSerializer.instance) objectMapper.registerModule(simpleModule) return objectMapper } } 在Kotlin...但是这个回答提供的构造Bean的方式我不是很喜欢,因此我又找到了另一个帖子 Custom json serialization java primitives from kotlin by Jackson...val <T : Any> KClass<T>.javaObjectType: Class<T> 返回对应于给定KClass实例的 Java Class实例。...在原始类型的情况下,它返回相应的包装类。
再来看下Kotlin中的反射结构: Kclass代表类信息,Kparameter代表参数信息,而KCallable和Accessible一样代表的都是可调用的元素。...而java中的Field只代表这个字段,setget是在另外一个Method结构中 KFunction统一了构造函数,包含Kproperty的Setter和Getter。...Kotlin的增强 和java中的反射一样使用,不同的是Kotlin中由于多了很多特性所以其元数据类型也比java中多,比如: metaclass描述类的类型kclass。...: KCallable可通过KClass的members成员获取,其返回值是Collection> 通过上面的信息已经可以获取到了类,属性和方法的信息,那么我们该如何获取参数信息呢...泛型方法一样通过KCallable的typeParameters获取,在KClass中通过startProjectedType属性获取。
看上去不是我代码的问题,因为错误信息说:Kotlin 反射对于内置类型还没有完全支持!! 什么鬼!还能不能愉快的玩耍了?...随便 Google 了一下,果然我不是一个人在坑里呆着: Support reflective access to built-in classes and members 好吧,我们看看报错的究竟是什么鬼...报错的位置是 String 的一个叫 length 的属性,好的,我们在 String.kt 文件当中呢,只能看到下面的代码: public class String : ComparableKotlin 版本(1.1.4-2)的反射库貌似也没有怎么做优化,所以不论你是获取方法,还是获取属性,亦或是获取扩展属性和方法,Kotlin 都首先会计算出这个类所有的成员然后再来筛选,我们随便找两个例子大家一看便明白了...不得不说, Kotlin 的坑,基本上都是为了兼容 Java 导致的,比如前面几篇文章提到的类型映射的问题,数据类的问题,相信在 Kotlin 后面的版本,这些问题都将不是问题~~
互操作就是在Kotlin中可以调用其他编程语言的接口,只要它们开放了接口,Kotlin就可以调用其成员属性和成员方法,这是其他编程语言所无法比拟的。...静态字段 在命名对象或伴生对象时,声明的 Kotlin 属性会在该命名对象或包含伴生对象的类中包含静态幕后字段。通常这些字段是私有的,但可以通过以下方式之一暴露出来。...internal 类的成员会通过名字修饰,使其更难以在 Java 中意外使用到,并且根据 Kotlin 规则使其允许重载相同签名的成员而互不可见; public 保持 public。...KClass 有时你需要调用有 KClass 类型参数的 Kotlin 方法。...型变的泛型 当 Kotlin 的类使用了声明处型变时,可以通过两种方式从Java代码中看到它们的用法。
前不久 JetBrains 在北京搞了一次技术大会,我在演讲当中提到了一个叫 DeepCopy 的库,那么我们今天就来详细说说它。 我们有什么拷贝的需求?...: data class GitUser(val name: String) { fun copy(name: String = this.name) = GitUser(name) } 如果成员是...不过问题不大,我们总是会想办法让编译器或者运行时来帮我们搞定一切,于是我想到了要不要写个 Kotlin 的编译期插件呢,正巧 KotlinConf 也有人分享了一下这个话题,不过由于目前这套机制还没有正式开放...KClass)?.isData == true) { parameter to value?....项目详情 这个项目在 11月17日的 JetBrains 大会上我已经提到过了,项目在 Github 上,地址:https://github.com/enbandari/KotlinDeepCopy,我知道公众号没法点地址
然后我在 Android 的主工程中编写这些桥接接口的实现,以及对 KMM 中业务逻辑的调用。...在 Android 上完成基本的测试,能跑通之后,由我的一位同事(也是小组 leader)在 iOS 主工程中编写类似我在 Android 主工程中编写的代码(Objective-C)。...上述差异导致的最严重问题就是 Kotlin/Native 类在 Kotlin 工程中拿不到 class 对象。在 Java 中所有类都有类型为 Class在 Kotlin/JVM 中,Kotlin 有自己的 KClass 类型,它与 Java 的 ClassKotlin/Native 中,KClass 无法获取一个类的 Objective-C 的 class 对象,这最直接的结果就是许多现有的 Objectice-C 库,可能含有需要传入一个 class
引子 前几天推送了一篇文章:你绝对想不到 Kotlin 泛型给反射留下了怎样的坑!,受到一位朋友的评论的启发,这篇文章就承接前文,探讨一下 T::class 和 this::class 区别。...我们在定协议时要求类型 T 有默认构造方法,以便于我们通过反射实例化它。 我们知道 Kotlin 的泛型也是伪泛型,T 在这里不能直接用于获取其具体的类型,如果我们想要初始化 t,该怎么做呢?...classifier as KClass) .primaryConstructor!!....其次,获取泛型实参,并拿到实参类型的 KClass 实例。 最后,调用主构造器构造对象 T。...不一样: Got raise: 31 Got big raise: 31000 Got big raise: 31000000 这里我还想要告诉大家的是,Java 跟 Kotlin 的结果是一样的。
另外,对于静态方法、变量的场景,在 Kotlin 当中建议使用包级函数。 4....如何实例化类 Java 和 C++ 这样的语言,在构造对象的时候经常需要用到 new 这个关键字,比如: Date date = new Date(); Kotlin 构造对象时,不需要 new...如何延迟初始化成员变量 Java 定义的类成员变量如果不初始化,那么基本类型被初始化为其默认值,比如 int 初始化为 0,boolean 初始化为 false,非基本类型的成员则会被初始化为 null..."Peter"; } 也就是说,如果我要想定义一个可以延迟到一定实际再使用并初始化的 final 变量,这在 Java 中是做不到的。...代码看上去确实很奇怪,实际上 Hello::class 拿到的是 Kotlin 的 KClass,这个是 Kotlin 的类型,如果想要拿到 Java 的 Class 实例,那么就需要前面的办法了。
如果我们需要使用类的成员函数或扩展函数,它需要是限定的,例如 String::toCharArray。...类型的值 请注意,Kotlin 类引用与 Java 类引用不同。...要获得 Java 类引用, 请在 KClass 实例上使用 .java 属性。...这些函数基本上做了同样的事情:在一个对象上执行一个代码块。不同的是这个对象在块中如何使用,以及整个表达式的结果是什么。...的高阶函数、匿名函数和 Lambda 表达式 Kotlin官网
Kotlin:Kotlin是一种在Java虚拟机上运行的现代编程语言,它也支持类似于Java的反射功能。通过使用KClass和KFunction等类型,开发人员可以在运行时获取和调用类的信息。...目标元素的可访问性: 反射允许访问程序的私有成员和方法,但需要注意的是,访问私有成员可能违背了封装原则。在使用反射操作私有成员时,需要注意代码的安全性和设计。...doSomething() { } public void setValue(int value) { this.value = value; } } 这块代码我分别在编译器和...getDeclaredField快 Android虚拟:getDeclaredField比getMethod快 当我第一次看到这个结果的时候也是十分不解,连续点了半个小时下来发现结果依然不同,这时我突然想到是不是编译器的...而getDeclaredField涉及到访问私有字段并且需要额外的访问权限,可能在某些情况下执行较慢。
两个团队在同一家公司工作,或许他们可以互相交流并就遮蔽问题达成共识。我从个人角度赞成 IDEA 的做法因为我想不到有哪些应用场景需要遮蔽方法参数。...repository : MongoExperimentsRepository 伴生对象 一位 Java 程序员来到 Kotlin 面前。 “嗨,Kotlin。我是新来的,我可以使用静态成员吗?"...我是面向对象的,静态成员不是面向对象的。” Kotlin 回答。 “好吧,但我需要 MyClass 的 logger,我该怎么办?” “这个没问题,使用伴生对象即可。” “那是什么东西?”...“很详细的语法,”程序员看起来很疑惑,“但是没关系,现在我可以像 MyClass.logger 这样调用我的 logger,就像 Java 中的一个静态成员?”...我很欣赏对象声明的概念——单例很有用。但从语言中删除静态成员是不切实际的。在 Java 中我们使用静态 Logger 很经典,它只是一个 Logger,所以我们不关心面向对象的纯度。
【文件同步助手】 通过终端服务,让你的终端空间在平台端完整的展现并提供强大的文件以及数据库操作能力。...初始化 在 App 启动的时候进行初始化。...{ } } 在初始化的时候注册自定义组件。...*/ @JvmStatic fun removeFloating(targetClass: KClass) { }..., clazz: KClass ): T?
,我在写代码") } } class Doctor(age: Int) : Person1(age) { override val age: Int get() = 6...//5.传入后又重写 override fun work() { println("我是医生,我给人看病") } } 默认的类和方法都是final,如果想要被子类继承,...中如static一样调用 val TAG = "Latitude" } } 每个类可以对应一个伴生对象 伴生对象的成员全局独一份 伴生对象的成员类似Java的静态成员 静态成员考虑用包级函数...可继承父类,实现多个接口,与Java注意区别. kotlin内部类与java 内部类的区别 java的内部类可以直接访问外部类的成员, kotlin的内部类不能直接访问外部类的成员 必须用inner标记之后才能访问外部类的成员...枚举类中定义方法,那么要在枚举对象最后加上; 这基本是Kotlin中唯一一个需要强制写;的地方 密封类 密封类与枚举的区别:前者是子类可数,后者是实例可数 密封类(Sealed Class)的子类必须和父类定义在同一个文件中
和 @Nullable 注解 二、Kotlin 的 Java 类型映射 三、Kotlin 访问 Java 私有属性 四、Java 调用 Kotlin 函数 1、函数调用 2、分析 Kotlin 代码生成的字节码数据...默认情况下 所有的变量 都为 非空类型 ; 下面分别定义一个 Java 类 和 Kotlin 脚本 , 在 Kotlin 脚本调用调用 Java 类的成员 ; 2、Java 函数返回非空值和控制 代码示例...函数调用 Java 函数 在 Kotlin 中 调用上述类中的两个函数 , 是不会报错的 ; 但是 , 如果调用 空值 的 成员 , 则直接报 空指针异常 ; 代码示例 : fun main() {...访问 Java 私有属性 ---- 在 Java 中 , 如果要 访问 private 私有属性 , 需要 调用 Getter 和 Setter 方法 ; 在 Kotlin 中 , 直接使用 属性名称...代码 : 在 Kotlin 代码中 , 可以通过 实例对象.属性名 访问 Java 类中的 private 私有属性 ; 读取私有属性 : 使用 var name = javaMethod.name
在开始之前我还是决定先提一个曾经阴魂不散,困扰我很久的问题,了解这个问题的答案有助于我们理解接下来的内容。 Java虚拟机如何在运行时知道每一块内存存储数据的类型的?...如果在方法体内定义的,这时候就是在栈上分配的 如果是类的成员变量,这时候就是在堆上分配的 如果是类的静态成员变量,在方法区上分配的 引用类型 引用类型跟基础数据类型不一样,除了对象本身之外,还存在一个指向它的引用...kclass kclass存储的是该对象所属的类在方法区的地址,所以是一个指针,默认Jvm对指针进行了压缩,用4个字节存储,如果不压缩就是8个字节。...父类的私有成员变量是否会被子类继承? 答案当然是肯定的,我们上面分析的Apple类,父类Fruit有一个private类型的size成员变量,Apple自身也有一个size成员变量,它们能够共存。...注意划重点了,类的成员变量的私有访问控制符private,只是编译器层面的限制,在实际内存中不论是私有的,还是公开的,都按规则存放在一起,对虚拟机来说并没有什么分别!
领取专属 10元无门槛券
手把手带您无忧上云