news 2026/6/8 4:29:06

跟我一起学“仓颉”编程语言-反射和注解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跟我一起学“仓颉”编程语言-反射和注解

一、反射

反射指程序可以访问、检测和修改它本身状态或行为的一种机制。

反射这一动态特性有以下的优点:

  • 提高了程序的灵活性和扩展性。

  • 程序能够在运行时获悉各种对象的类型,对其成员进行枚举、调用等操作。

  • 允许在运行时创建新类型,无需提前硬编码。

但使用反射调用,其性能通常低于直接调用,因此反射机制主要应用于对灵活性和拓展性要求很高的系统框架上。对于仓颉的反射特性,需要知道 TypeInfo 这一类型,这个核心类型中记录任意类型的类型信息,并且定义了方法用于获取类型信息、设置值等。

package Study // 导包 import std.reflect.* class User{ User(var name: String, var age: Int64){} func show() { println(name) println(age) } } main () { let user: User = User("钝子生", 23) // 用反射来获取一个自定义类型的类型信息 let info: ClassTypeInfo = ClassTypeInfo.of(user) let info2: ClassTypeInfo = ClassTypeInfo.get("Study.User") println(info) println(info2) }

使用反射还可以获取类里面的成员

package Study // 导包 import std.reflect.* public class User{ public let _name: String = "钝子生" public var _age: Int64 = 23 public prop name: String { get () { this._name } } public mut prop age: Int64 { get () { this._age } set (_age) { this._age = _age } } public static func add(a: Int64, b: Int64) { a + b } } main () { let user = User() let info = ClassTypeInfo.of(user) let instanceProps = info.instanceProperties.toArray() println("user的实例成员属性包含${instanceProps}") let PropName = info.getInstanceProperty("name") let PropAge = info.getInstanceProperty("age") println((PropName.getValue(user) as String).getOrThrow()) println((PropAge.getValue(user) as Int64).getOrThrow()) // 通过反射修改name的值 if (PropName.isMutable()) { PropName.setValue(user, 10) } // 通过反射修改age的值 if (PropAge.isMutable()) { PropAge.setValue(user, 20) } println((PropName.getValue(user) as String).getOrThrow()) println((PropAge.getValue(user) as Int64).getOrThrow()) // 通过反射获取函数 let funcInfo: StaticFunctionInfo = TypeInfo.of<User>().getStaticFunction("add", TypeInfo.of<Int64>(), TypeInfo.of<Int64>()) let result = (funcInfo.apply(info, [1, 5]) as Int64).getOrThrow() println(result) }

二、注解

自定义注解机制用来让反射(详见反射章节)获取标注内容,目的是在类型元数据之外提供更多的有用信息,以支持更复杂的逻辑。

开发者可以通过自定义类型标注@Annotation方式创建自己的自定义注解。@Annotation只能修饰class,并且不能是abstractopensealed修饰的class。当一个class声明它标注了@Annotation,那么它必须要提供至少一个const init函数,否则编译器会报错。

package Study // 导包 import std.reflect.* /* * 自定义注解 */ @Annotation public class Version { let code: String const init(code: String) { this.code = code } } @Version["V1.0"] public class User { public let _name: String = "钝子生" public var _age: Int64 = 23 public prop name: String { get () { this._name } } public mut prop age: Int64 { get () { this._age } set (_age) { this._age = _age } } public static func add(a: Int64, b: Int64) { a + b } } main () { let version = ClassTypeInfo.of(User()).findAnnotation<Version>().getOrThrow() println(version.code) }

三、小结

本章为大家详细的介绍了仓颉编程语言中反射和注解的内容,下一章,为大家带来跨语言互操作的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉服务端开发有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 4:28:06

MATLAB量化投资入门包:K线绘图+ARIMA预测+马科维茨组合优化全实现

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;直接上手的MATLAB股票分析工具集&#xff0c;含6支A股历史行情CSV数据&#xff08;如sh600198、sh600006&#xff09;和整合后的four_stocks.csv。stock_plots.m支持K线图、布林带、竹线图、卡吉图、砖线图五种…

作者头像 李华
网站建设 2026/6/8 4:26:18

用C# Winform手搓一个ModbusRTU调试助手(附完整源码)

用C# Winform手搓一个ModbusRTU调试助手&#xff08;附完整源码&#xff09;工控领域的开发者们经常需要与各种PLC、传感器设备打交道。当我们需要快速验证设备通讯、调试寄存器读写时&#xff0c;一个轻量级的ModbusRTU调试工具能极大提升工作效率。本文将带你从零开始&#x…

作者头像 李华
网站建设 2026/6/8 4:22:24

Goque核心功能解析:栈、队列与优先级队列实战教程

Goque核心功能解析&#xff1a;栈、队列与优先级队列实战教程 【免费下载链接】goque Persistent stacks and queues for Go backed by LevelDB 项目地址: https://gitcode.com/gh_mirrors/go/goque Goque是一个基于LevelDB的Go语言持久化数据结构库&#xff0c;专为需要…

作者头像 李华
网站建设 2026/6/8 4:21:39

10分钟完成黑苹果配置:OpCore-Simplify让PC变Mac如此简单

10分钟完成黑苹果配置&#xff1a;OpCore-Simplify让PC变Mac如此简单 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾经羡慕macOS的流畅体验&…

作者头像 李华