当前位置: 首页 > news >正文

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

一、反射

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

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

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

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

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

但使用反射调用,其性能通常低于直接调用,因此反射机制主要应用于对灵活性和拓展性要求很高的系统框架上。对于仓颉的反射特性,需要知道 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) }

三、小结

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

http://www.jsqmd.com/news/972369/

相关文章:

  • 基于深度学习的 YOLOv11 目标检测与轴承缺陷质量控制轴承缺陷识别 (轴承数据集+模型+界面))
  • Webpack Bundle Size Analyzer核心原理:深入解析依赖树分析算法
  • 大模型应用后端底座设计与高并发支撑实践
  • FastANI终极指南:如何快速计算微生物基因组相似性
  • 终极指南:使用gh_mirrors/qq/qq-win-db-key修复与迁移损坏的QQ聊天记录数据库
  • 深入KEIL链接器:N32G45X串口打印背后,MicroLIB与标准C库的抉择与性能影响
  • 告别CAN报文丢失:深入解读S32K3的邮箱匹配算法与掩码优先级陷阱
  • 告别混乱!手把手教你为宝兰德BES中间件创建独立的“产品”与“应用”账号
  • GPT-4参数激活率真相:稀疏激活不是浪费,而是工程精算
  • 别只盯着CNN!手把手教你用Scikit-learn玩转Kaggle图像分类(Plant Seedlings保姆级教程)
  • 避坑指南:Xilinx FPGA里IDDR和ODDR原语的那些“坑”与最佳实践
  • 别再为HC-05配对发愁了!手把手教你用串口调试助手搞定主从蓝牙模块(附完整指令集)
  • SpringBoot自动配置翻车实录:手把手教你用@ConditionalOnMissingBean解决Bean冲突
  • 跟我一起学“仓颉”编程语言-跨语言互操作
  • 洛雪音乐音源:一站式免费音乐聚合终极方案
  • 10美元鼠标秒变苹果触控板:Mac Mouse Fix 如何释放 macOS 隐藏的鼠标潜能
  • LivePortrait深度解析:三分钟让静态人像开口说话的艺术
  • 终极指南:让Windows Vista和Server 2008也能运行最新Python 3.14
  • 告别EVT大杂烩:手把手教你为沁恒CH573打造清爽的MounRiver独立工程
  • 博德之门3脚本扩展器:3步解锁游戏无限可能
  • 2026年别墅朗盛门窗靠谱吗 - 品牌宣传支持者
  • GalTransl完整指南:三步实现Galgame智能AI汉化的终极方案
  • GPT-4的1.8万亿参数与2%激活真相:MoE架构深度解析
  • 告别Hello World!用ESP32和ESP-IDF 4.3亲手点亮第一颗LED(保姆级避坑指南)
  • 2026年质量好的内墙底层腻子粉/外墙抗开裂腻子粉/内墙抗裂腻子粉‌横向对比厂家推荐 - 行业平台推荐
  • AI2.0 【Embedding】嵌入模型 20260608
  • SpringBoot自动配置实战:用@ConditionalOnMissingBean优雅解决Bean冲突(附Drools配置案例)
  • 保姆级教程:在Windows上用ESP-IDF 4.3给ESP32开发板烧录第一个闪灯程序
  • emexDE:革命性iOS设备原生开发IDE,无需越狱即可在iPhone上编写iOS应用
  • 当你的模型‘偏科’时怎么办?深入解读多分类任务中的Precision与Recall权衡