首先,鲁斯特没有反思;反射意味着您可以在运行时获取有关类型的详细信息,例如字段,方法,它实现的接口等 . 您不能使用Rust执行此操作 . 您可以获得的最接近的是显式实现(或派生)提供此信息的特征 .

每种类型在编译时都会分配给它 TypeId . 因为具有全局排序的ID很难,所以ID是从包含的类型's definition, and assorted metadata about the crate in which it'的组合派生的整数 . 换句话说:它们只是用于定义类型的各种信息的哈希值 . [1]

impl Any for T {

fn get_type_id(&self) -> TypeId { TypeId::of::() }

}

(边界可以非正式地减少到"all types that aren't borrowed from something else" . )

您还可以找到 TypeId 的定义:

pub struct TypeId {

t: u64,

}

impl TypeId {

pub const fn of() -> TypeId {

TypeId {

t: unsafe { intrinsics::type_id::() },

}

}

}

intrinsics::type_id 是编译器识别的内部函数,在给定类型的情况下,返回其内部类型ID . 这个调用只是在编译时用文字整数类型ID替换;这里没有实际的电话 . [2]这就是 TypeId 知道类型的ID是什么 . TypeId ,然后,只是这个 u64 的包装器,以隐藏用户的实现细节 . 如果您发现它在概念上更简单,您可以将类型的 TypeId 视为编译器在编译时才知道的常量64位整数 .

Any 从 get_type_id 转发到此,意味着 get_type_id 实际上只是将特征方法绑定到适当的 TypeId::of 方法 . 它只是确保如果你有一个 Any ,你可以找到原始类型的 TypeId .

现在, Any 已针对大多数类型实现,但这并不意味着所有这些类型实际上都在内存中浮动 Any 实现 . 实际发生的是,如果有人编写需要它的代码,编译器只为类型的 Any 实现生成实际代码 . [3]换句话说,如果您从未对给定类型使用 Any 实现,则编译器将永远不会生成它 .

这就是Rust履行"do not pay for what do you not use"的方式:如果您从未将给定类型作为 &Any 或 Box 传递,则永远不会生成相关代码,也不会占用已编译二进制文件中的任何空间 .

[1]:令人沮丧的是,这意味着类型的 TypeId 可以根据库的编译方式进行更改,以便将其编译为依赖项(而不是独立构建)会导致 TypeId 更改 .

[2]:就我所知 . 我可能错了,但如果是这样的话,我会感到非常惊讶 .

[3]:这对于Rust中的泛型通常是正确的 .

java怎么样实现反射_Rust如何实现反射?相关推荐

  1. Java反射实践:从反射中理解class

    写在前面 今天在需求评审的时候,遇到了挺有意思的要求.需求是什么样子就不说了.总之完成这个需求需要一个调用系统api的操作.然而这个api因为并不稳定的原因.被谷歌hide掉了. 这个时候我们最直接的 ...

  2. java 反射 性能_java高性能反射及性能对比

    java编程中,使用反射来增强灵活性(如各类框架).某些抽象(如各类框架)及减少样板代码(如Java Bean). 因此,反射在实际的java项目中被大量使用. 由于项目里存在反射的性能瓶颈,使用的是 ...

  3. java測試動態方法_java反射学习

    反射的核心Class类 Class类是一个特殊的类,不能手动创建,只能由jvm来创建. jvm在类加载时会为每个类生成一个与之对应的Class对象在Java堆中(且每个类只会有一个对应的Class对象 ...

  4. java 反射api_Java学习笔记--反射API

    反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换. 按照 一般地面向对象的设计思路,一 ...

  5. java注解的反射_Java注解与反射

    概要 本文主要是总结Java注解与反射的相关知识,加深自己对Java类动态语言的理解,同时为日后学习Spring打下基础. 注解: 什么是注解 Annotation的作用 不是程序本身,但是可以对程序 ...

  6. Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持

    Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:(          ) A Java反射主要涉及的类如C ...

  7. Java高质量代码之 — 泛型与反射

    在Java5后推出了泛型,使我们在编译期间操作集合或类时更加的安全,更方便代码的阅读,而让身为编译性语言的Java提供动态性的反射技术,更是在框架开发中大行其道,从而让Java活起来,下面看一下在使用 ...

  8. Java面向对象编程篇6——注解与反射

    Java面向对象编程篇6--注解与反射 1.注解概述 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制 Java 语言中的类.方法.变量.参数和包等都可 ...

  9. java反射源码_java反射技术详解附源码

    在学校学习Java时,由于学的不扎实,也没经历过太多实战项目,所以很多重要的知识点瞟一眼就过去了,比如现在要讲的反射,当时直接就忽略掉了,可现在发现很多地方需要反射,不得不重新学习一下,上学欠了太多债 ...

最新文章

  1. CSDN 湘苗培优,打造高素质技术人才
  2. 传统软件的云计算之路
  3. 启动窗口画面类CSplashWnd
  4. 怎么将matlab滤波器系数导出_matlab与FPGA数字信号处理系列(1)——通过matlab工具箱设计FIR数字滤波器...
  5. C/C++搞不懂指针还是数组?用sizeof解释struct大小!
  6. Linux shell脚本中如何读取跟shell脚本同一目录下的配置文件
  7. 斐波那契数列PHP非递归数组实现
  8. vuex实现及简略解析
  9. 旋转矩阵(Rotation matrix):旋转轴与旋转角 ( axis and angle )
  10. c语言eval函数,百行代码轻便实现C#中的Eval函数
  11. 【云原生 | Envoy 系列】--Envoy Http Ingress,Egress,front Proxy静态配置
  12. Linux系统安全及应用-grub菜单启用密码限制10
  13. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
  14. 使用计算机对炼钢过程进行,转炉炼钢计算机数采监控技术及应用
  15. 使用cookiecutter创建pyramid项目
  16. [gdc13]《孤岛危机3》渲染技术
  17. oracle dba导入,“只有DBA才能导入由其他DBA导出的文件”各种解决办法
  18. 释万行上师:罕见的修行真相揭秘【全】
  19. 【查找算法】二叉排序树查找法
  20. 京东主图如何优化,一键自动替换长图

热门文章

  1. 用html怎样实现抽奖效果,html5+css3实现抽奖活动的效果
  2. 七天免登陆有效期 java_JWT过期刷新问题,实现十五天免登陆
  3. 错误:没有找到合适的设备:没有找到可用于链接System eth0 的设备
  4. 为什么说线上教育是未来的趋势?
  5. 超凡颖想之一【换位思考】
  6. 2022渗透测试-信息收集笔记
  7. 2000门课程名称翻译大全,写英文简历时用得着的
  8. Linux安装和部署
  9. Codeforces 819 C. Mister B and Beacons on Field 容斥 数学
  10. Spring Boot中的配置文件使用以及重新加载