什么是Emit,什么是反射,二者区别到底是什么?(转)
允许编译器或工具发出元数据和发出 Microsoft 中间语言 (MSIL) ,并可选择在磁盘上生成 PE 文件的类。
这些类的主要客户端是脚本引擎和编译器。
}
Emit可以直接让编译器发出元数据及msil,这样做的优势又是什么?
所以,我们的.NET程序最终都是以这些中间语言存储起来的,在运行后,又由即时编译器直接转换成真正的机器语言执行. emit这种优势在于可以在程序动态运行的过程中,直接生成IL运行(可谓灵活且不失高效)
反射的原理及性能问题引用Jeffrey Richter的一段话: 元数据是用一系列的表来存储的.生成一个程序集或模块时,编译器会创建一个类型定义表、一个字段定义表、一个方法定义表以及其他表.利用反射命名空间(sytem.reflection,所以可知emit是其一个附属,不是独立的)中包含的一些类型,可以用代码来解析(就是所谓的反射)这些元数据表.
反射有两个缺点:1.反射无法在编译期间保证类型的安全;2.反射速度慢.(我们需要使用sytem.reflection命名空间中的类型扫描程序集的元数据,反射要不断地执行字符串的搜索)
总结反射包含emit,反射性能低原因在于需要扫描程序集或模块的元数据表.emit性能高,在于能够动态生成msil立即执行.它们各据其位,所以用emit时其实你就在用反射(至少你需要它).为了提高性能,我们可以动态创建一些方法来达到我们想要的目的(动态代理).
(术语有不足之处,希望纠正)
什么是Emit,什么是反射,二者区别到底是什么?(转)的更多相关文章
- CheckStateChanged(复选框选中状态更改事件)和 CheckedChanged(单选按钮选中状态更改事件)二者区别?
CheckStateChanged(复选框选中状态更改事件)和 CheckedChanged(单选按钮选中状态更改事件)二者区别: 复选框控件(CheckBox)提供了CheckedChanged控件 ...
- Introspector内省和反射的区别.
Introspector 是一个专门处理bean的工具类.用来获取Bean体系里的 propertiesDescriptor,methodDescriptor. 要理解这个,就要理解下面几个议题. ...
- java——抽象类、接口、二者区别
抽象类: 抽象方法:不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰: abstract void method(); 抽象类:当一个类中包含了抽象方法时,该类必须使用abs ...
- attr(),prop()二者区别和最佳实践
attr(),prop()二者区别和最佳实践 最近使用到attr()来获取自定义属性值,我印象中是有一个方法可以获取到自定义属性值,进而我又想到了另一个方法prop(). 查看了手册发现并没有对二者 ...
- Synchronized和ReentTrantLock二者区别
写在前面 Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock.这两种锁以及后面提到 ...
- 年薪5w和50w的人,区别到底在哪?
年薪5w和50w的人,区别到底在哪? 2017-02-22 阿青 360投资圈 文/ 阿青 许多人在职场摸爬滚打很多年并不顺利,薪酬一直上不去.职场鸡汤喝了不少,也掌握了不少职场技能,工作经验也颇为丰 ...
- 用Emit技术替代反射
之前在上篇博客说到用表达式来替代反射机制,可以获得较高的性能提升.这篇我们来说说用Emit技术来替代反射. System.Reflection.Emit命名空间类可用于动态发出Microsoft中间语 ...
- java两种反射的区别 - Class.forName()和ClassLoader.loadClass()
在理解这两种反射机制之前,需要弄清楚java类的加载机制. 装载:通过类的全限定名获取二进制字节流(二进制的class文件),将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lan ...
- AR和VR的区别到底在哪?
AR是Augmented Reality的字母缩写,中文名字是“增强现实”,是一种全新人机交互技术.通过AR技术,让参与者与虚拟对象进行实时互动,从而获得一种奇妙的视觉体验,而且能够突破空间.时间以及 ...
随机推荐
- Nginx笔记02-nginx常用参数配置说明
nginx的主配置文件是nginx.conf,这里主要针对这个文件进行说明 1.主配置文件nginx.conf 2.nginx配置文件的结构 从上面的配置文件中我们可以总结出nginx配置文件的基 ...
- 在jenkins和sonar中集成jacoco(二)--在jenkins中生成jacoco覆盖率报告
先要在jenkins上安装jacoco的插件,安装完成之后在job的配置项中可以增加这个选项: 第一个录入框是你的覆盖率文件(exec),第二个是class文件目录,第三个是源代码文件目录. 配置好了 ...
- oracle创建定时器详解|interval属性
定时任务首先先创建定时任务中的存储过程 create or replace procedure pro_jggl as ...
- L181 The microscopic structure of a cat’s tongue helps keep its fur clean
T.S. eliot's mystery cat, Macavity, besides being a criminal mastermind able to evade the combined r ...
- ionic2中跨页面回传值
1.在跳转到新页面时传入一个contactsCallback的参数,在该参数的函数定义中做出一个承诺. 注意:最开始我本来是采用如下图方式的,但是很不幸,出现了问题,问题所在就是关于这个this的作用 ...
- ppt修改默认字体
首先,在文本框中输入文字,选中文字设置为自己需要的效果,比如文字字体设置为微软雅黑,大小设置为24,颜色设置为水绿色. 鼠标移动到到输入文本框的边上,此时鼠标形状会变成十字形,单击右键,在弹出 ...
- Trie树学习1
Trie树.也称为字典数,前缀树,每一个单词的每一个字母依照顺序相应一个节点.有重合的前缀就共享节点. 理想情况下(满的情况).假若全部的单词都是N长,则树共同拥有N层,每层都是26个子节点. 在程序 ...
- linux下配置python环境 django创建helloworld项目
linux下配置python环境 1.linux下安装python3 a. 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件) yum groupinstal ...
- DCI改进,发布后作业乱码不能打开
1.发布后作业不能打开问题,找到com.comsys.net.cn.dci.ui.dialog.PublishesDialog 的960行,改为这样: //以前没有指定文件编码前,采用系统默认编码 / ...
- vue 整合雪碧图功能
1.通过命令新建一个vue项目 环境要求: 安装有 Node.js. vue. vue-cli . 创建项目: vue init webpack tx_demo cd tx_demo 进入项目,下载依 ...