首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

注解与反射

本章内容包括: 应用定义注解 在运行时使用反射进行自省 一个真正 Kotlin 项目实例 10.1 声明并应用注解 /**-------------------------...10.8 顶层反序列化函数 // 代码清单10.9 反序列化一个对象 /**--------10.2.5 反序列化最后一步:callBy()使用反射创建对象----.../ 代码清单10.12 缓存反射数据存储 // 代码清单10.13 构造方法参数及注解数据缓存 // 代码清单10.14 验证需要参数被提供了 总结 Kotlin...一个注解参数可以是一个基本数据类型、一个字符串、一个枚举、一个引用、一个其他注解实例,或者前面这些元素组成数组。...反射 API 让你在运行时动态地列举访问一个对象方法属性。它拥有许多接口来表示不同种类声明,例如KClass )、函数( KFunctio川等。

96110

第12章 元编程与注解、反射第12章 元编程与注解、反射

第12章 元编程与注解、反射 反射(Reflection)是在运行时获取函数(方法)、属性、父、接口、注解元数据、泛型信息等内部信息机制。...@Retention 指定这个注解信息是否被保存到编译后 class 文件中, 以及在运行时是否可以通过反射访问到它, 可取枚举有3个,分别是: SOURCE (注解数据不存储在二进制输出),...BINARY(注解数据存储在二进制输出中, 但反射不可见), RUNTIME(注解数据存储在二进制输出中, 可用于反射 (默认 ) 。...如何让注解在程序运行时候发挥其特有的作用呢?核心就在于注解处理代码了。本小节我们将学习怎样进行注解信息获取处理。...6)) val kClass = container::class // 获取KClass对象 需要注意是,Kotlin中引用Java中引用是不同,要获得java引用,可以直接使用 javaClass

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

    Java 反射 VS Kotlin 反射

    kotlin.reflect.full 是主要 Kotlin 反射 API kotlin.reflect.jvm 用于 Kotlin 反射 Java 反射互操作。...Kotlin 反射特性包含: 提供对属性可空类型访问权限,这是由于 Java 没有属性可空类型概念。 Kotlin 反射不是 Java 反射替代品,而是功能增强。...可以使用 Kotlin 反射来访各种基于 JVM 语言编写代码。 下面以 Java 反射 Kotlin 反射进行对比。 一....KClass 也是 Kotlin 反射 API 主要入口。 在 Kotlin 中,字节码对应也是 kotlin.reflect.KClass。...Kotlin 引用有两种方式:名::class对象::class,它们获取都是相同 KClass 实例。 即处于同一个加载器中,给定类型只能返回一个 KClass 实例。

    2.6K30

    为什么 Go 语言 struct 要使用 tags

    struct tags 使用 struct tags 使用还是很广泛,特别是在 json 序列化,或者是数据库 ORM 映射方面。...在定义上,它以 key:value 形式出现,跟在 struct 字段后面,除此之外,还有以下几点需要注意: 使用引号 在声明 struct tag 时,使用引号 ` 包围 tag ,可以防止转义字符影响...例如,对于序列化序列化,可以使用 json、xml、yaml 等;对于数据库操作,可以使用 db。...使用 struct tag 主要优势之一是可以在运行时通过反射来访问操作 struct 中字段。...此外,使用 struct tag 还可以提高代码可读性可维护性。在一个大型项目中,struct 中字段通常会包含很多不同元信息,比如数据库中表名、字段名、索引、验证规则等等。

    1.2K20

    聊聊Kotlin中元编程

    程序即是数据 这个很好理解,通过指定程序来获取构成这个程序信息,比如一个Book,我们可以动态获取这个属性行为,其实就是反射。...再来看下Kotlin中反射结构: Kclass代表信息,Kparameter代表参数信息,而KCallableAccessible一样代表都是可调用元素。...Kotlin增强 java中反射一样使用,不同是Kotlin中由于多了很多特性所以其元数据类型也比java中多,比如: metaclass描述类型kclass。...: KCallable可通过KClassmembers成员获取,其返回是Collection> 通过上面的信息已经可以获取到了,属性方法信息,那么我们该如何获取参数信息呢...结构kclass等相关程序构成数据

    83640

    Java创建Annotation

    正如我们稍后将看到,注解保留运行时选项是最常见选项之一,因为它允许Java程序反射访问注解并基于存在注解执行代码,以及访问与注解相关联数据。请注意,注解只有一个关联保留策略。...对于我们JSON序列化程序,我们将创建一个字段注解,允许开发人员在序列化对象时标记要转换字段名。例如,如果我们创建汽车,我们可以使用我们注解来注解汽车字段(例如品牌型号)。...,(2)记录包含@JsonField注解所有字段名称(或显式提供字段名称),以及(3)将所记录字段名键值对转换成JSON字符串。...并使用此对象关联来获取关联字段。接下来,我们创建StringStringMap,存储字段名键值对。 随着数据结构建立,接下来遍历中声明每个字段。...如果是,我们确定字段名称(通过@JsonField注解中提供显式名称或默认名称),并在我们先前构造map中记录名称字段。处理完所有字段后,我们将字段名映射转换为JSON字符串。

    1.5K20

    Kotlin 反射有个坑你们知道么!

    由于目前 Kotlin 版本(1.1.4-2)反射库貌似也没有怎么做优化,所以不论你是获取方法,还是获取属性,亦或是获取扩展属性方法,Kotlin 都首先会计算出这个所有的成员然后再来筛选,我们随便找两个例子大家一看便明白了...,只要这个当中存在向 Java 或者方法映射问题,那么它反射就基本上用不了。...考虑 Number 极其子类也都存在类型映射情况,这里特别说明一下,以上问题在 Number 家族中并不存在,看来支持其他类型也就是时间问题啦。 哇靠,遇到这样问题该怎么办呢?...通过论坛帖子了解,Kotlin 反射目前也没有做太多优化工作,使用起来比等价 Java 反射也要慢一些,所以使用时请大家三思。...不得不说, Kotlin 坑,基本上都是为了兼容 Java 导致,比如前面几篇文章提到类型映射问题,数据问题,相信在 Kotlin 后面的版本,这些问题都将不是问题~~

    1.1K20

    你绝对想不到 Kotlin 泛型给反射留下了怎样坑!

    本文需要你对泛型反射有相对深入了解,反正。。阅读过程中有任何不适,本人概不负责。:)逃 1. 有坑自远方来。。...话说呀,我们有一个很简单需求,就是为很多个添加一个 description 方法,这个方法返回就是这个属性名以及,例如下面这个: class Person(val name: String...it.get(this@description) 这一句看上去很合理,it 是一个属性反射引用,通过 get 传入调用者 this 来获取当前属性,很正常嘛,我们在 Java 中都是这么干呀。...当然是从获取反射引用 KClass 对象来,也就是 this::class 这个对象了,这个对象难道不应该是 KClass 吗?No,是 KClass!...当中)处理方式是一致,返回都是协变,但对于反射来说,Java 对参数类型要求几乎没有,而 Kotlin 则非常严格,这样会导致问题就是 Kotlin 反射使用起来有些难受。

    8.3K21

    巧用Kotlin反射实现按取名,调试做到多快好省

    ,如果单纯是打印int,并不能足够解释业务信息,所以,为了更好输出信息,我们通常会这样做 1 2 3 4 5 6 7 8 9 10 11 private fun inspectItemTypeUgly...那么 我们可以利用变量值查找对应变量名 借助 Kotlin便捷特性反射库,我们可以更好更轻松实现。...秀代码 针对 Java (接口)普通 Kotlin 1 2 3 4 5 6 7 8 fun getConstantNameByValueFromNormalClass(kClass: KClass...但是 Kotlin无法直接访问到 top level 层级 我们需要借助一些变量来辅助获取 top level 层级 但是 Kotlin反射无法top level,所以我们必须使用java..." 性能问题 都说,反射的话性能比较差,是的,但是也不是那么差。

    91930

    Gson 系列文章

    JSON 序列化序列化入门 Java-JSON 序列化基础 先来看一些序列化例子,Gson 中序列化意味着将 Java 对象映射成 JSON 数据格式,在接下来教程中,我们会逐步介绍一些更复杂情况...Lists 对象映射 Array List 差异 在我们介绍序列化之前,我们先来看下 Java 中两种数据结构:Array List。...,在 Java Model 中包含要映射变量引用就可以了,要注意名字JSON中字段名相同。...alternate 属性是用在反序列化,也就是说从 JSON Java 过程。Gson 会帮我们匹配 JSON 中命名,并尝试找到一个字段映射。...reviewerName; //不用分隔线,采用驼峰命名 } Gson Builder — 序列化 序列化 之前例子中,空映射中,如果你数据结构中没有给字段赋值或者设置 null,序列化

    15.6K10

    也许你需要这个为数据生成 DeepCopy 方法

    Project 这两个数据内部字段都是基本类型,用 copy 进行复制似乎也问题不大,可如果它们成员当中也存在数据呢?...所以,你需要为每一个数据定制一个 deepCopy 方法。。。 来来来,先实现个简单 天哪。那岂不是要写死了。...用反射再配合 Kotlin 最优秀特性之一扩展方法,我们就可以为所有的无缝提供一个 deepCopy 扩展方法,当然,我们目标是为数据服务,所以其他调用这个方法我们一概直接返回(~ ̄▽ ̄)...copy 很像了,不同之处就是我们会递归检查哪些数据被标注为 DeepCopy,如果标注,就递归调用对应 deepCopy 函数。...其实如果不添加默认,这个注解处理器非常容易写,因为它不需要处理泛型,不需要处理与 Java 类型映射,也不需要处理别名,一气呵成,就像这样: fun Owner.deepCopy(): Owner

    74920

    Retrofit 妙用,拒绝重复代码!

    只做数据流转,具体数据序列化 // 交给类似 GsonConverterFactory retrofit.nextResponseBodyConverter...let { converter -> // 如果有能处理返回 Converter 创建代理 ConvexConveter...// Convex 是一个 ServiceRegistry, 用于存储 ConvexTransformer // 如果没有 ConvexTransformer 便会通过反射创建对应...定义 BaseResponse // 用于处理后台返回数据进行反序列化,拿到最终 data 数据 data class BaseResponse( @SerializedName("errorCode...而且这种方案还支持多种不同数据类型,因为不同 Method 可以指定不同 ConvexTransformer, 而具体业务处理根本不用关系 BaseResponse 是如何处理, 因为具体业务代码拿到都是具体

    68850

    golang源码分析:encodingjson(1)

    G,jsonkey 默认是字段名,但是如果结构体设置了tag,key受到tag影响,tag可以是逗号分割多个字段。比如"omitempty",跳过空。tag是"-"字段会被跳过。...,会返回UnsupportedTypeError 错误 K,带环数据结构,序列化会返回错误 L,当嵌套字段字段同级字段名字冲突时候,如果加tag后名字不一样,都序列化,否则选择外面的,忽略嵌套...,也会充分利用sync.Map来缓存遇到过类型对应序列化方法,避免重复反射操作,来提升性能。...,来提升复用减少反射操作,但是,对象序列化方法对应关系,还是在运行时通过反射方式建立来写入sync.Map,这里有两个比较低效操作,map写入反射建立类型与序列化方法对应关系。...在明确知道类型情况下,这个过程其实可以在编译时完成,减少运行时消耗。在同一型反复序列化场景,官方库通过缓存方式,能够提升后面几次序列化性能。

    30020

    Hibernate核心对象关系映射

    (3)创建一个实体存放两个主键作为属性,并且实现setget,并且必须实现可序列化;    之后这个实体数据表中非两个主键字段构成一个新实体,并且实现setget方法,    <class...属性不能是sql语句关键字,比如desc关键字做描述时候,如果非要使用, 可以使用``(shift+~)引号,不然就要改列名; 1 <?...-- 7 第一部分:映射文件:映射一个实体对象,用来描述一个对象最终实现可以直接保存对象数据数据库中 8 package(可选):要映射对象即实体所在包,如果不指定package...--> 19 (3):普通字段映射:property 20 name:指定对象属性名称; 21 column:指定对象属性对应字段名称...--             非主键映射,普通字段映射            name:字段属性名称,其他字段可以不写;            column:对应数据字段名称;

    1.9K60

    Mybatis常见面试题(10个必备面试题)

    面试题九:使用MyBatismapper接口调用时有哪些要求? 面试题十:笔试手写题 模糊查询like语句该怎么写? 当实体属性名表中字段名不一样 ,怎么办 ?...默认不打开二级缓存,要开启二级缓存,使用二级缓存属性需要实现Serializable序列化接口(可用来保存对象状态),可在它映射文件中配置 ; (3)对于缓存数据更新机制,当某一个作用域(一级缓存...有了列名与属性名映射关系后,Mybatis通过反射创建对象,同时使用反射给对象属性逐一赋值并返回,那些找不到映射关系属性,是无法完成赋值。 面试题八:Mybatis动态sql有什么用?...第一种:通过在查询sql语句中定义字段名别名,让字段名别名实体属性名一致。...-- 实体字段名数据字段名映射 --> <result property="name

    3.1K21

    简单 C++ 结构体字段反射

    这个过程就涉及到了两次数据结构转换: 输入 JSON 转换为 C++ 数据结构(反序列化 deserialization) C++ 数据结构 转换为 输出 JSON(序列化 serialization...动态反射 “崇尚偷懒” Google 工程师,为 chromium/base::Value 构建了一套基于 动态反射 (dynamic reflection) 序列化机制,实现统一 JSON数据...: value_converter_.operator(),传入当前结构体中字段字段名称;其中结构体 obj 字段通过 obj->*field_pointer_ 得到 最后,针对 结构体...静态反射 实际上,实现序列化/反序列化所需要信息(有哪些字段,每个字段位置、名称、映射方法),在 编译时 (compile-time) 就已经确定了 —— 没必要在 运行时 (runtime) 动态构建...:字段名称 (field_value, field_name) 字段通过 value.

    4.8K41

    简单 C++ 结构体字段反射

    这个过程就涉及到了两次数据结构转换: 输入 JSON 转换为 C++ 数据结构(反序列化 deserialization) C++ 数据结构 转换为 输出 JSON(序列化 serialization...动态反射 “崇尚偷懒” Google 工程师,为 chromium/base::Value 构建了一套基于 动态反射 (dynamic reflection) 序列化机制,实现统一 JSON...: value_converter_.operator(),传入当前结构体中字段字段名称;其中结构体 obj 字段通过 obj->*field_pointer_ 得到 最后,针对 结构体...静态反射 实际上,实现序列化/反序列化所需要信息(有哪些字段,每个字段位置、名称、映射方法),在 编译时 (compile-time) 就已经确定了 —— 没必要在 运行时 (runtime) 动态构建...:字段名称 (field_value, field_name) 字段通过 value.

    6.3K32

    Golang之旅17-结构体可见性JSON序列化

    结构体可见性 结构体中字段大写开头表示可公开访问,小写表示私有(仅在定义当前结构体包中可访问) 不管是结构体还是结构体字段名,大写可以公开访问 小写则只能当前包内访问 JSON序列化 JSON(JavaScript...JSON键值对是用来保存JS对象一种方式 键值对中键名写在前面,用双引号包裹起来 键值之间使用冒号分开 多个键值对之间用英文逗号分开 如何将json数据go语言格式数据之间进行转换❔ Go----...序列化 // Go语言中如果定义标识符是首字母大写,则是对外可见 // 结构体中字段名是大写,则是对外可见 type student struct { ID int Name string...Tag是结构体元信息,可以在运行时候通过反射机制读取出来。...Tag在结构体字段后方定义,由一对引号包裹起来,具体格式如下: `k1:"v1" k2:"v2"` //键值对组成 标签组成部分 由一个或者多个键值对组成 键之间使用冒号:分开 用双引号

    1K30

    新年新语言,WCDB Swift

    模型绑定 WCDB Swift 模型绑定,基于 Swift 4.0 协议实现。通过建立 Swift 类型与数据库表之间映射关系,使得开发者可以通过对象直接操作数据库。...ObjC 版本使用指针,使得 WCDB 可以获取变量,并插入数据库中,或从数据库中获取数据写入变量。 2. 数据库字段映射。...因此我们尝试使用“不常规”方法,获取到对应 property 名称。 是 Swift 里反射类型,它可以遍历每个变量,获取其名称,但不能对变量写入数据。...它是 Swift 4.0 新增特性,本质是编译前根据定义生成代码,以完成序列化序列化任务。...对应到 WCDB,将数据字段读写到变量中,其本质就是一个序列化序列化过程,而也可能可以用于语言集成查询中字段映射

    1K90

    是时候使用Kotlin编程了

    在Java中泛型是不变,比如:虽然A继承B,但ListList之间没有任何关系,Java是通过泛型通配符来实现型变: 3,反射 反射是运行于JVM中程序检测修改运行时一种行为,通过反射可以在运行时获取对象属性方法...Kotlin中反射如下。 要调用具体对象时,可以不通过KClass对象,直接调用方法访问属性。...Kotlin Native Kotlin Native是一种将Kotlin源码编译成不需要任何VM支持目标平台二进制数据技术,编译后二进制数据可以直接运行在目标平台上,它主要包含一个基于LLVM后端编译器一个...this表达式 6.5 小结 第7章 数据与密封 7.1 数据 7.1.1 对象复制 7.1.2 序列化 7.1.3 成员解构 7.2 密封 7.3 小结 第8章 集合与泛型 8.1集合 8.1.1...引用 10.1.2 成员引用 10.1.3 函数引用 10.1.4 属性引用 10.1.5 构造函数引用 10.1.6 KClass反射 10.1.7 对象序列化Json 10.2 注解 10.2.1

    3.2K10

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券