什么是低级反射,什么是高级内丹覆盖低级内丹反射,我搞不清楚

什么是瞳孔反射,有几种?(原创)
什么是瞳孔反射,有几种?
&我们大都有这样的经历,到医院去看病,经常会看到医生在患者眼前来回的比划着,检查瞳孔反射,那么瞳孔反射有几种?检查瞳孔反射又有什么意义呢?
&我们知道,瞳孔的大小是受神经调节的,因此检查瞳孔反射,不仅有生理上的意义,还可以对一些神经的功能做出判断,作为诊断的参考。
&主要的瞳孔反射有三种:
&1、光发射:当外界光线强时,瞳孔缩小;当外界光线弱时,瞳孔散大,这就是光反射。
&检查光反射的方法是:在一般的室内均匀的光线下,用开亮的手电筒,从眼睛的侧方迅速的移向被检查者一侧眼睛的前方,即可观察到瞳孔缩小,然后移开手电筒,可见瞳孔散大。在检查中,不仅被照那一侧的瞳孔有改变,而且对侧的瞳孔也会发生相同的变化,这叫做&交叉反射&,这是因为子中枢发出的神经纤维同时控制着两侧缩瞳肌的缘故。通过这个检查,可以初步判断,眼睛的传入、传出神经的功能,以及神经所知配的肌肉的功能变化。
&光反射的生理意义在于调节进入眼球的光量,使眼睛能随时适应较大变化的光照条件。如此一来,光线过强时瞳孔缩小,限制了光线的入眼量,避免了过强的光线对视网膜的损伤;光线弱时瞳孔散大,增加了光线的入眼量,以利于视网膜得到足够强的刺激,保证能看清物体。
&瞳孔调节反射:瞳孔调节反射的意义在于:视近物时,瞳孔缩小,能够遮蔽眼睛边缘的光线,减少球面相差,同时缩小了角膜的视角面,防止了由于角膜曲度不规则所形成的散光,增加了视觉的准确度。在病理条件下,大脑功能障碍可使调节反射迟钝或者消失。
&3、瞳孔&皮肤反射(睫脊反射):用针刺或用手掐颈后的皮肤时,瞳孔会散大。无论是皮肤抑或是内脏的疼痛,总会伴以瞳孔的散瞳反应,这都是神经传导的结果。颈交感神经受损伤时,这一反射消失。
&松江龙华津。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
请各位遵纪守法并注意语言文明什么是反射弧? - 反射弧是什么?
| 什么是反射弧?
反射弧是什么?
用户:o_o123321
什么是反射弧?数学问题啊
最佳答案用户:原初的混沌以我现在的知识难的问题,我不会给你解释其它答案用户:cf5257我知道这是一个反映就是传说中的狐狸反射弧其它答案用户:a神经冲动的基本载体其它答案用户:kylewangk反射弧怎么一个数学问题,哦?其它答案用户:pwbly反射弧反射活动的结构基础称为反射弧,包括感受器,传入神经 ,神经中枢,传出神经和效应器(见图)。简而言之,反射过程如下:一定感受器受到刺激按一定发生受体兴奋的感觉,兴奋神经冲动通过传入神经 到中央的方式,通过分析和综合活动中心,中央发电兴奋中枢兴奋过程;中枢兴奋过程也受到一定的传出神经到达效应,效应发生相应的活动。如果出现中枢抑制,原来中央传出冲动减弱或停止。在实验条件下,人工远程直接作用于传入神经 刺激也可引起反射活动,但在自然条件下,反射活动一般都是受一个完整的反射弧实验,如果任何一个环节反射弧中断,反映了不能发生。感觉周围神经组织通常是一个特殊的结构,可以内幕信息的外部刺激到神经兴奋性活动,其中受体是一种信号转换装置。往往体现在一个特定的刺激后发生的特异性受体,特异性受体称为反射性感受野是网站。中枢神经系统是由大量的神经元,这些神经元组合成许多不同的神经。是某一特定人群的神经元的调节生理功能的神经中枢。一般而言,该中心作为一个简单的反射,其范围较窄,如膝跳反射的腰椎脊髓中央角膜反射中枢在脑桥。但是作为一个复杂的生命活动的调节中心,它的范围是非常广泛的,如调节中枢性呼吸运动分散延髓,脑桥,下丘脑和大脑皮质的其他部位内。延髓呼吸神经活动的基本结构,而不是延髓呼吸功能相关的神经元群的一部分,调整呼吸活动,使其更加丰富的适应性。
& 2012 - 2017君,已阅读到文档的结尾了呢~~
2012公务员考试题,公务员考试真题下载,公务员考试题库,公务员考试,2013公务员考试真题,公务员考试真题,公务员考试题库大全,国家公务员考试真题,公务员考试资料,行政能力测试
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
2012公务员考试题
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口什么是反射、反射可以做些什么 - 文章 - 伯乐在线
& 什么是反射、反射可以做些什么
什么是反射,反射能干嘛?
反射是:指程序可以访问、检测和修改它本身状态或行为的一种能力
反射是一种能力,所以给的定义就是说明了它能干嘛。
我们平时用反射主要做:
获取类型的相关信息
动态调用方法
动态构造对象
从程序集中获得类型。
获取类型的相关信息
反射的核心Type类,Type对象提供的属性和方法可以获取对象的一切信息,如:方法、字段、属性、事件…等等。
我们获取已加载程序集中类型的Type对象的几种方法:(以StringBuilder 类型为例)
直接使用typeof操作符 Type T1 = typeof(StringBuilder);
通过类型实例 Type T2 = new StringBuilder().GetType();
通过Type类的静态方法 Type T3 = Type.GetType(“System.IO.Stream”);
不管使用那种,我们最终得到的结果都是一样的。
那么我们通过Type又能得到些什么信息呢?
获取类型本身信息(命名空间名、全名、是否是抽象、是否是类、、、等等)
var T1 = typeof(StringBuilder);
Console.WriteLine("命名空间名称:" + T1.Namespace);
Console.WriteLine("直接基类型:" + T1.BaseType);
Console.WriteLine("全名:" + T1.FullName);
Console.WriteLine("是抽象类型:" + T1.IsAbstract);
Console.WriteLine("是类:" + T1.IsClass);
//.....等等
<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf
var T1 = typeof(StringBuilder);&&&&&&&&&&&&&&&&&&&&&&Console.WriteLine("命名空间名称:" + T1.Namespace);Console.WriteLine("直接基类型:" + T1.BaseType);Console.WriteLine("全名:" + T1.FullName);Console.WriteLine("是抽象类型:" + T1.IsAbstract);Console.WriteLine("是类:" + T1.IsClass);//.....等等
获取类型成员信息(通过Tyep中的方法GetMembers)
Type T1 = typeof(TClass);
var Mets = T1.GetMembers();//获取Type对象的所有公有成员
foreach (var m in Mets)
Console.WriteLine("【" + m.MemberType.ToString()+ "】:" + m.Name);
// m.MemberType 是成员类型
Type T1 = typeof(TClass);var Mets = T1.GetMembers();//获取Type对象的所有公有成员&&&&&&&&&& foreach (var m in Mets){&&&&Console.WriteLine("【" + m.MemberType.ToString()+ "】:" + m.Name);&&&&// m.MemberType 是成员类型}
MemberType所能包含的成员类型有哪些呢?如:(可以自己可以F12进去看看)
注意:其中MemberInfo的属性DeclaringType返回的是这个属性定义的类型,而ReflectedType返回的是获取这个属性的对象类型。
Type T2 = typeof(TClass);
var Mets = T2.GetMembers();//获取所有公共成员(返回值是MemberInfo类型集合)
foreach (var m in Mets)
if (m.Name=="Equals")
Console.WriteLine("【" + m.MemberType.ToString() + "】:" + m.Name);
// m.MemberType 是成员类型
// m.DeclaringT//获取申明该成员的类
// m.ReflectedT//获取用于获取 MemberInfo 的此实例的类对象。
<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf
Type T2 = typeof(TClass);var Mets = T2.GetMembers();//获取所有公共成员(返回值是MemberInfo类型集合)foreach (var m in Mets){&&&&if (m.Name=="Equals")&&&&{&&&&&&&&Console.WriteLine("【" + m.MemberType.ToString() + "】:" + m.Name);&&&&&&&&// m.MemberType 是成员类型&&&&&&&&&// m.DeclaringT//获取申明该成员的类&&&&&&&&// m.ReflectedT//获取用于获取 MemberInfo 的此实例的类对象。 &&&&&} }
T2中的Equals,我们知道这个方式是在Objec中定义的,在TClass中调用的,所以:
我们发现获取Type对象的成员大多都是以 isxxx、Getxxx、Getxxxs格式的。
isxxx格式的基本上都是判断是否是某类型。
Getxxx和Getxxxs都是放回某类型和某类型集合。其中主要的类型有:
//FieldInfo封装了关于字段的所有信息
(通过Tyep对象的GetFields或GetField方法)
//PropertyInfo类型,封装了类型的属性信息;(通过Type对象的GetProperties或GetProperty方法)
//ConstructorInfo类型,封装了类型的构造函数信息; (..........)
//MethodInfo类型,封装了类型的方法信息;
(........)
//MemberInfo类型,封装了类型的所有公共成员;(**就是我们上面说的GetMembers方法**)
//EventInfo类型,封装了类型的事件信息;(.......)
//ParameterInfo类型,封装了方法和构造函数的参数信息;(........)
<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf
//FieldInfo封装了关于字段的所有信息&& (通过Tyep对象的GetFields或GetField方法)&//PropertyInfo类型,封装了类型的属性信息;(通过Type对象的GetProperties或GetProperty方法)&//ConstructorInfo类型,封装了类型的构造函数信息; (..........)&//MethodInfo类型,封装了类型的方法信息;&&(........)&//MemberInfo类型,封装了类型的所有公共成员;(**就是我们上面说的GetMembers方法**)&//EventInfo类型,封装了类型的事件信息;(.......)&//ParameterInfo类型,封装了方法和构造函数的参数信息;(........)
它们都在 System.Reflection 命名空间下,其每个isxxx、Getxxx、Getxxxs的细节实例用法就不一一演示了。和上面的GetMembers用法区别不大。
动态调用方法
首先定义个类:
public class TClass
public void fun(string str)
Console.WriteLine("我是fun方法,我被调用了。" + str);
public void fun2()
Console.WriteLine("我是fun2方法,我被调用了。");
public static void fun3()
Console.WriteLine("我是fun3静态方法,我被调用了");
12345678910111213141516
public class TClass{&&&&public void fun(string str)&&&&{&&&&&&&&Console.WriteLine("我是fun方法,我被调用了。" + str);&&&&}&&&&public void fun2()&&&&{&&&&&&&&Console.WriteLine("我是fun2方法,我被调用了。");&&&&}&&&&&public static void fun3()&&&&{&&&&&&&&Console.WriteLine("我是fun3静态方法,我被调用了");&&&&}}
调用方式一(使用InvokeMember调用方法)
调用带参实例方法fun
Type T1 = typeof(TClass);
T1.InvokeMember("fun", BindingFlags.InvokeMethod, null, new TClass(), new string[] { "test" });
Type T1 = typeof(TClass);T1.InvokeMember("fun", BindingFlags.InvokeMethod, null, new TClass(), new string[] { "test" });
调用无参实例方法fun2
Type T1 = typeof(TClass);
T1.InvokeMember("fun2", BindingFlags.InvokeMethod, null, new TClass(), null);
<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf
Type T1 = typeof(TClass);T1.InvokeMember("fun2", BindingFlags.InvokeMethod, null, new TClass(), null);
调用静态方法
Type T1 = typeof(TClass);
T1.InvokeMember("fun3", BindingFlags.InvokeMethod, null, T1, null);
<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf
Type T1 = typeof(TClass);T1.InvokeMember("fun3", BindingFlags.InvokeMethod, null, T1, null);
我们发现了一个问题当我们调用实例方法的时候需要传实例对象过去。(有人会说,都实例对象了,我还要你动态掉调用个屁啊。有种情况,在我们实例了对象后,仍不确定应该调用那个方法时可以只有使用。然后有人有说了,那如果实例对象我也不确定呢?那我们下面会分析连实例对象也给动态了。那接着完下看吧。)
我们来说下这几个参数的意思吧。
第一个:要被动态调用的方法名。
第二个:是一个枚举,表示是调用一个方法
第三个:是Binder,传的是null,使用默认值。
第四个:传如实例对象(调用实例方法时)或者Type对象(调用静态方法时)。
第五个:要传给被调用发的参数数组。
调用方式二(使用MethodInfo.Invoke调用方法)
Type T1 = typeof(TClass);
T1.GetMethod("fun", BindingFlags.Instance | BindingFlags.Public).Invoke(new TClass(), new string[] { "testfun1" });
T1.GetMethod("fun2", BindingFlags.Instance | BindingFlags.Public).Invoke(new TClass(), null);
T1.GetMethod("fun3", BindingFlags.Static | BindingFlags.Public).Invoke(T1, null);
<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf
Type T1 = typeof(TClass);T1.GetMethod("fun", BindingFlags.Instance | BindingFlags.Public).Invoke(new TClass(), new string[] { "testfun1" });T1.GetMethod("fun2", BindingFlags.Instance | BindingFlags.Public).Invoke(new TClass(), null);T1.GetMethod("fun3", BindingFlags.Static | BindingFlags.Public).Invoke(T1, null);
使用其实和上面的方式一区别不大。
真正的全动态调用
上面的两种方式,在编写代码的时候总是要先确定了已知的对象名和方法名。那么我们在不知道对象和方法名的时候是否也可以调用呢?答案是肯定的,实现如下:
Console.WriteLine("请输入对象类名");
string className = Console.ReadLine();
Console.WriteLine("请输入要执行的方法名");
string funName = Console.ReadLine();
Type T1 = Type.GetType(className);
ConstructorInfo ci = T1.GetConstructors()[0]; //获取构造函数
var obj = ci.Invoke(null);//实例化构造函数
T1.InvokeMember(funName, BindingFlags.InvokeMethod, null, obj, null);
1234567891011
Console.WriteLine("请输入对象类名");string className = Console.ReadLine();Console.WriteLine("请输入要执行的方法名");&string funName = Console.ReadLine();Type T1 = Type.GetType(className);&ConstructorInfo ci = T1.GetConstructors()[0]; //获取构造函数 var obj = ci.Invoke(null);//实例化构造函数&T1.InvokeMember(funName, BindingFlags.InvokeMethod, null, obj, null);
当然,这个代码只能只是fun2,因为上面的传参写死了。(你也可以自己稍微修改下,就可以执行fun、fun2、fun3了)
效果如下:(对象名和方法名都是手动输入的)
动态构造对象
我们先定义一个对象:
public class TClass
public TClass()
Console.WriteLine("构造函数被执行了。。");
public TClass(string str)
Console.WriteLine("有参构造函数被执行了。。" + str);
<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf
public class TClass{&&&&public TClass()&&&&{&&&&&&&&Console.WriteLine("构造函数被执行了。。");&&&&}&&&&public TClass(string str)&&&&{&&&&&&&&Console.WriteLine("有参构造函数被执行了。。" + str);&&&&}&&&&&&&&}
动态构造对象
//动态构造对象,方式一
Assembly asm = Assembly.GetExecutingAssembly();
TClass obj = (TClass)asm.CreateInstance("net.tclass", true);//true:不区分大小写
//动态构造对象,方式二
ObjectHandle handler = Activator.CreateInstance(null, " net.TClass");//null:当前程序集
obj = (TClass)handler.Unwrap();
//动态构造对象,方式三(构造有参构造函数)
Assembly asm2 = Assembly.GetExecutingAssembly();
obj = (TClass)asm2.CreateInstance("net.tclass", true, BindingFlags.Default, null, new string[] { "test" }, null, null);//true:不区分大小写
<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf
//动态构造对象,方式一Assembly asm = Assembly.GetExecutingAssembly();TClass obj = (TClass)asm.CreateInstance("net.tclass", true);//true:不区分大小写&//动态构造对象,方式二ObjectHandle handler = Activator.CreateInstance(null, " net.TClass");//null:当前程序集obj = (TClass)handler.Unwrap();&//动态构造对象,方式三(构造有参构造函数)Assembly asm2 = Assembly.GetExecutingAssembly();obj = (TClass)asm2.CreateInstance("net.tclass", true, BindingFlags.Default, null, new string[] { "test" }, null, null);//true:不区分大小写
执行效果图:
获取和修改属性
var obj = new TClass();
obj.name = "张三";
Type type = typeof(TClass);
//获取属性
var Name = type.InvokeMember("name", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null,
obj, new object[] { })
Console.WriteLine(obj.name);
//设置属性
type.InvokeMember("name", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null,
obj, new object[] { "新属性(李四)" });
Console.WriteLine(obj.name);
<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf
var obj = new TClass();obj.name = "张三";Type type = typeof(TClass);//获取属性var Name = type.InvokeMember("name", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null,&&&&&&&&&&&&&&&&&&&& obj, new object[] { }) as string;Console.WriteLine(obj.name);//设置属性type.InvokeMember("name", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null,&&&&&&&&&&&&&&&&&&&&&&obj, new object[] { "新属性(李四)" });Console.WriteLine(obj.name);
从程序集中获得类型
取得当前代码所在程序集(使用GetExecutingAssembly)
Assembly ass = Assembly.GetExecutingAssembly();
Console.WriteLine("当前所在程序集名:"+ass.ManifestModule.Name);
Console.WriteLine("当前所在程序集路径:"+ass.Location);
Assembly ass = Assembly.GetExecutingAssembly();Console.WriteLine("当前所在程序集名:"+ass.ManifestModule.Name);Console.WriteLine("当前所在程序集路径:"+ass.Location);
通过反射加载程序集并创建程序中的类型对象
从程序集中获得类型,这个应该是我们平时用得比较多。如我们所谓的依赖注入和控制反转(这个主题将在下篇博文进行分析)就用到了通过反射从程序集中获取类型。
首先我们还是看看怎么从程序集中获得类型吧。我们可以使用Assembly类型提供的静态方法LoadFrom()或Load(),如:
Assembly asm = Assembly.LoadFrom("Demo.dll");
Assembly asm = Assembly.Load("Demo");
Assembly asm = Assembly.LoadFrom("Demo.dll");Assembly asm = Assembly.Load("Demo");
Assembly asm = Assembly.LoadFrom("net.exe");//需要加后缀,可以指定路径,如下面的
Assembly asm1 = Assembly.LoadFrom(@"C:1文件5SvnBlogsCodeBlogsBlogs.WebbinBlogs.BLL.dll");
Assembly asm2 = Assembly.Load("Blogs.BLL");//无需加后缀,不可以指定路径
//Assembly asm3 = Assembly.Load(@"C:1文件5SvnBlogsCodeBlogsBlogs.WebbinBlogs.BLL");//这里会报错
//使用Load可以加载当前程序bin目录行下的程序集或者系统程序集
//这里TClass可以是一个接口,那么可以在外面的dll任意实现了。
TClass obj = (TClass)asm2.CreateInstance("net.tclass", true);//true:不区分大小写
obj.fun();//***调用动态加载的dll中的方法***
<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf<div class="crayon-num" data-line="crayon-58ebf<div class="crayon-num crayon-striped-num" data-line="crayon-58ebf
Assembly asm = Assembly.LoadFrom("net.exe");//需要加后缀,可以指定路径,如下面的Assembly asm1 = Assembly.LoadFrom(@"C:1文件5SvnBlogsCodeBlogsBlogs.WebbinBlogs.BLL.dll");&Assembly asm2 = Assembly.Load("Blogs.BLL");//无需加后缀,不可以指定路径//Assembly asm3 = Assembly.Load(@"C:1文件5SvnBlogsCodeBlogsBlogs.WebbinBlogs.BLL");//这里会报错//使用Load可以加载当前程序bin目录行下的程序集或者系统程序集&//这里TClass可以是一个接口,那么可以在外面的dll任意实现了。&&TClass obj = (TClass)asm2.CreateInstance("net.tclass", true);//true:不区分大小写obj.fun();//***调用动态加载的dll中的方法***
这样带来的功能是非常强大的。如 我们在没有引用程序集的情况下,也可以使用到程序外的程序集。我们还可以根据不同情况引用不同的程序集。我们甚至还可以通过配置文件来直接配置代码运行时应该加载哪个dll,运行哪个dll中的哪个实现方法。(下篇在讲依赖注入的时候会讲到,同学们继续关注哦~)
从上所知,反射不是某一个概率,而是一类操作的统称。或者说是某些能力的统称。 感觉不好回答反射到底是什么,只能说反射能干什么。它能动态创建对象、动态调用对象方法、动态读取和设置属性和字段、它能动态加载程序外的dll。总的感觉就是大多数都是跟“动态”扯上了关系。
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
&#8211; 好的话题、有启发的回复、值得信赖的圈子
&#8211; 分享和发现有价值的内容与观点
&#8211; 为IT单身男女服务的征婚传播平台
&#8211; 优秀的工具资源导航
&#8211; 翻译传播优秀的外文文章
&#8211; 国内外的精选文章
&#8211; UI,网页,交互和用户体验
&#8211; 专注iOS技术分享
&#8211; 专注Android技术分享
&#8211; JavaScript, HTML5, CSS
&#8211; 专注Java技术分享
&#8211; 专注Python技术分享
& 2017 伯乐在线

我要回帖

更多关于 java高级流和低级流 的文章

 

随机推荐