项目总结——传说中的反射竟然是这个样子

这阵子项目结束之后,大家开始了总结,关于在项目中用到的各种知识,如AOP,CAS,SSO,多线程,分布式缓存,反射,WCF,框架,建库切库等等。虽然有的知识了解的不是很深,但是大致上都有了一个认识。那么今天,就让我们来谈谈传说中的反射。

1、是什么

(1).NET中的反射机制

反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。

(2)Java中的反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

(3)到底是什么

反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

举个例子来说,我们每个人都照过镜子,镜子中会展现我们完美的身材,那么这是通过什么实现的呢,小学学过自然科学的都知道,这是光的反射造成的。这就是反射。

通过反射,我们可以清楚的看到任何一个对象的样子(属性和方法)。当然镜子中的像不是提前准备好放进去的,而是根据现有的对象,在一定条件下,解析出该对象的所有东西,然后展示出来的。这就是反射。

2、为什么

话说这个反射时怎么产生的,我们为什么要用呢。之前我们学习面向对象的思想,利用封装将一个对象的内外隔开了,从而减少了与外部的耦合, 同时它也影响了灵活性,比如,我们需要修改某个类的属性或方法,或者是为其添加一个方法,那么我们就需要去代码中修改它。尤其是我们在我们在运行过程中需要改变它时,就更加困难了。于是乎反射就来了。

就像真实世界一样,我们需要把一些东西包装起来,给那些不用知道其内部结构的人用,这叫封装。而有时候又需要把一个东西的内部呈现出来,了解其构造,然后做出相应改变,这叫反射。

3、优缺点

静态编译:在编译时确定类型,绑定对象,即通过。

动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。

(1)优点:一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中,它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。

(2)缺点:它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。

4、总结

反射机制是框架技术的原理和核心部分。通过反射机制我们可以动态的通过改变配置文件(以后是XML文件)的方式来加载类、调用类方法,以及使用类属性。这样的话,对于编码和维护带来相当大的便利。在程序进行改动的时候,也只会改动相应的功能就行了,调用的方法是不用改的。更不会一改就改全身。

反射其实就是通过反编译解析出类或dll文件的结构,然后通过遍历得到相应的元素。它就是通过动态解析,得到我们所需的属性和方法。

在此,我想说,学习一个东西,一定要结合实际,联系生活,看看它是怎么来的,为什么要有。只有这样,我的学习才能越来越轻松。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-08 05:22:20

项目总结——传说中的反射竟然是这个样子的相关文章

项目中的那些事---Java反射的应用

最近工作中遇到一个这样的问题: 为某个项目中的所有接口做一个测试工具,使用java Swing技术,该项目有不同的版本,不是所有版本中的接口都是相同的,而我做的工具需要兼容所有版本. 于是就引入了这样一个问题: 有些接口如果在部分版本中不存在,那么通过界面执行这个操作的时候就会报错,所以为了兼容所有版本,就要在方法调用之前考虑方法是否存在,同时为了不在编译时抛异常,在调用方法时 也需要通过反射来调用,具体实现如下: 一.使用反射判断方法是否存在 1 /** 2 * 判断方法是否存在 3 * 4

关于C#反射Assembly.load() .CreateInstance() 未报错, 返回对象为空

这几天开始新项目,在AbstractDalFactory反射实例的时候,遇到的问题是load程序集成功,但是Create实例为null. 被反射的程序集名称和命名空间都为s2s.Dal, 刚开始我在想,会不会是中间的有个点 . 的问题,转而一想不可能啊,因为我AutoFac依赖注入s2s.BLL对象的时候,中间也有的点.啊. 第一天晚上调试了几个小时,今天晚上调试几个小时之后我终于决定重新创建一个DAL程序集,命名为s2s_Dal. 果然问题解决了. 按照情况来看,的确是.影响了.NETFram

项目问题总结:Block内存泄露 以及NSTimer使用问题

BLock的内存泄露 在我们代码中关于block的使用可以说随处可见,第一次接触block的时候是关于UIView的块动画,那时觉得block的使用好神奇,再后来分析总结为block其实就是一个c语言函数,只是我们可以在任意处调用此函数.有了这样的理解我开始经常使用block.在做项目以后发现使用block竟然会引起内存泄露,于是开始自己调试研究block的内存管理问题. 普通的block使用(包括块动画) 这里有一个简单的block使用,在里面我们可以添加任何自己想进行的操作,大部分的使用也是

Linux江湖23:使用Eclipse和Gnu Autotools管理C/C++项目

在我该系列的之前的所有随笔中,都是采用 Linux 发行版自带的包管理工具(如 apt-get.yum 等)进行软件的安装和卸载,从来没有向大家展示使用源代码自行编译安装软件的方法.但是长期混迹于 Unix/Linux 世界的童鞋们都知道,从源代码自行编译安装软件并不是那么的难,一般都是这样三个步骤: configure make make install 之所以能够把源代码的构建管理得如此简单,这得益于 Gnu 的 Autotools 工具链.在上面的三个命令中,configure 是一个脚本

C#反射技术概念作用和要点

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌.如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道. 1..NET可执行应用程序结构 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构. 应用程序结构分为应用程序域—程序集—模块—类型—成员

Win7上的ASP.NET MVC3项目在Win10上运行的一个坑

先解释一下问题:我原来的电脑环境是Win7+VS2015,因为新换了个电脑环境变成Win10+VS2015了,所以就把原先的项目复制到新的机器上,那么问题来了,原先的一个项目在VS2015上打开竟然直接报错(注意:这里不是发布到IIS上,就是直接用VS中F5运行).报的错很常见,但是一般的解决办法都不试用,解决可是废了老大劲儿了. 未能加载文件或程序集"System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31b

C# 反射技术应用

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌.如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道. 反射是一种机制,通过这种机制我们可以知道一个未知类型的类型信息.比如,有一个对象a,这个对象不是我们定义的,也许是通过网络捕捉到的,也许是使用泛型定义的,但我们

c#根据配置文件反射

由于项目中用到了反射,准备把各个类库都先写在配置文件中,然后读取配置文件,再对配置文件中配置的类库进行反射. 这样做的好处是各个类库保持独立,其中一个类库出现问题不会影响其他类库,更新项目时,只要更新单个DLL就可以了. 1. 首先看下配置文件怎样进行配置 在上面的配置文件中创建了自定义节点processors,然后在processors节点下面对应的是方法节点. 上面的项目中使用了两个方法,所以创建了两个节点.type表示程序集名称, method表示方法名称. 2.看下怎样使用配置文件 [h

用反射通过构造函数给窗体传参

最近在项目上用到反射来调用方法用的比较多,传参包含两种方式,一种是通过变量传参,第二种是通过构造函数传参,下面分别介绍下两种方式: 先介绍几种获取实例的方法,下面描述中提到的三种方法其实都是大同小异的,核心就是通过System.Reflection.Assembly 类型的CreateInstance方法创建实例. //反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间,假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly ass