C#中的引用问题

C#中的引用问题,第1张

利用反射进行动态加载和调用

Assembly ass=AssemblyLoadFrom(DllPath); //利用dll的路径加载

加载dll后,需要使用dll中某类

Type type=assGetType(“TypeName”);//利用类型的命名空间和名称获得类型

需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略

Object obj = ActivatorCreateInstance(type,params[]);//利用指定的参数实例话类型

调用类型中的某个方法:

需要首先得到此方法

MethodInfo mi=typeGetMethod(“MehtodName”);//通过方法名称获得方法

然后对方法进行调用,多态性利用参数进行控制

miInvoke(obj,params[]);//根据参数直线方法,返回值就是原方法的返回值

Java动态程序设计 反射介绍 使用运行的类的信息使你的程序设计更加灵活反射授予了你的代码访问装载进JVM内的Java类的内部信息的权限 并且允许你编写在程序执行期间与所选择的类的一同工作的代码 而不是在源代码中 这种机制使得反射成为创建灵活的应用程序的强大工具 但是要小心的是 如果使用不恰当 反射会带来很大的副作用 在这篇文章中 软件咨询顾问Dennis Sosnoski 介绍了反射的使用 同时还介绍了一些使用反射所要付出的代价 在这里 你可以找到Java反射API是如何在运行时让你钩入对象的 在第一部分 我向你介绍了Java程序设计的类以及类的装载 那篇文章中描述了很多出现在Java二进制类格式中的信息 现在我来介绍在运行时使用反射API访问和使用这些信息的基础 为了使那些已经了解反射基础的开发人员对这些事情感兴趣 我还会介绍一些反射与直接访问的在性能方面的比较 使用反射与和metadata(描述其它数据的数据)一些工作的Java程序设计是不同的 通过Java语言反射来访问的元数据的特殊类型是在JVM内部的类和对象的描述 反射使你可以在运行时访问各种类信息 它甚至可以你让在运行时读写属性字段 调用所选择的类的方法 反射是一个强大的工具 它让你建立灵活能够在运行时组装的代码 而不需要连接组件间的源代码 反射的一些特征也带来一些问题 在这章中 我将会探究在应用程序中不打算使用反射的原因 以为什么使用它的原因 在你了解到这些利弊之后 你就会在好处大于缺点的时候做出决定 初识class 使用反射的起点总时一个java lang Class类的实例 如果你与一个预先确定的类一同工作 Java语言为直接获得Class类的实例提供了一个简单的快捷方式 例如 Class clas = MyClass class;当你使用这项技术的时候 所有与装载类有关的工作都发生在幕后 如果你需要在运行时从外部的资源中读取类名 使用上面这种方法是不会达到目的的 相反你需要使用类装载器来查找类的信息 方法如下所示 // name is the class name to loadClass clas = null;try {clas = Class forName(name);} catch (ClassNotFoundException ex) {// handle exception case}// use the loaded class如果类已经装载 你将会找到当前在在的类的信息 如果类还没有被装载 那么类装载器将会装载它 并且返回最近创建的类的实例 关于类的反射 Class对象给予你了所有的用于反射访问类的元数据的基本钩子 这些元数据包括有关类的自身信息 例如象类的包和子类 还有这个类所实现的接口 还包括这个类所定义的构造器 属性字段以及方法的详细信息 后面的这些项是我们在程序设计过种经常使用的 因此在这一节的后面我会给出一些用这些信息来工作的例子 对于类的构造中的每一种类型(构造器 属性字段 方法) java lang Class提供了四种独立的反射调用以不的方式来访问类的信息 下面列出了这四种调用的标准形式 它是一组用于查找构造器的调用 Constructor getConstructor(Class[] params)  使用指定的参数类型来获得公共的构造器 Constructor[] getConstructors()获得这个类的所有构造器 Constructor getDeclaredConstructor(Class[] params) 使用指定的参数类型来获得构造器(忽略访问的级别)Constructor[] getDeclaredConstructors() 获得这个类的所有的构造器(忽略访问的级别)上述的每一种方法都返回一或多个java lang reflect Constructor的实例 Constructor类定义了一个需要一个对象数据做为唯一参数的newInstance方法 然后返回一个最近创建的原始类的实例 对象数组是在构造器调用时所使用的参数值 例如 假设你有一个带有一对String 类型做为参数的构造器的TwoString类 代码如下所示 public class TwoString {private String m_s m_s ;public TwoString(String s String s ) {m_s = s ;m_s = s ;}}下面的代码显示如何获得TwoString类的构造器 并使用字符串 a 和 b 来创建一个实例 Class[] types = new Class[] { String class String class };Constructor cons = TwoString class getConstructor(types);Object[] args = new Object[] { a b };TwoString ts = cons newInstance(args);上面的代码忽略了几种可能的被不同的反射方法抛出的异常检查的类型 这些异常在Javadoc API中有详细的描述 因此为简便起见 我会在所有的代码中忽略它们 在我涉及到构造器这个主题时 Java语言也定义了一个特殊的没有参数的(或默认)构造器快捷方法 你能使用它来创建一个类的实例 这个快捷方法象下面的代码这样被嵌入到类的自定义中 Object newInstance() 使用默认的构造器创建新的实例 尽管这种方法只让你使用一个特殊的构造器 但是如果你需要的话 它是非常便利的快捷方式 这项技术在使用JavaBeans工作的时候尤其有用 因为JavaBeans需要定义一个公共的 没有参数的构造器 通过反射来查找属性字段 Class类反射调用访问属性字段信息与那些用于访问构造器的方法类似 在有数组类型的参数的使用属性字段名来替代 使用方法如下所示 Field getField(String name)  获得由name指定的具有public级别的属性字段Field getFields() 获得一个类的所有具有public级别的属性字段Field getDeclaredField(String name) 获得由name指定的被类声明的属性字段Field getDeclaredFields() 获得由类定义的所有的属性字段尽管与构造器的调用很相似 但是在提到属性字段的时候 有一个重要的差别 前两个方法返回能过类来访问的公共(public)属性字段的信息(包括那些来自于超类的属性字段) 后两个方法返回由类直接声明的所有的属性字段(忽略了属性字段的访问类型) Java lang reflect Field的实例通过调用定义好的getXXX和setXXX方法来返回所有的原始的数据类型 就像普通的与对象引用一起工作的get和set方法一样 尽管getXXX方法会自动地处理数据类型转换(例如使用getInt方法来获取一个byte类型的值) 但使用一个适当基于实际的属性字段类型的方法是应该优先考虑的 下面的代码显示了如何使用属性字段的反射方法 通过指定属性字段名 找到一个对象的int类型的属性字段 并给这个属性字段值加 public int incrementField(String name Object obj) throws {Field field = obj getClass() getDeclaredField(name);int value = field getInt(obj) + ;field setInt(obj value);return value;}这个方法开始展现一些使用反射所可能带来的灵活性 它优于与一个特定的类一同工作 incrementField方法把要查找的类信息的对象传递给getClass方法 然后直接在那个类中查找命名的属性字段 通过反射来查找方法 Class反射调用访问方法的信息与访问构造器和字段属性的方法非常相似 Method getMethod(String name Class[] params)  使用指定的参数类型获得由name参数指定的public类型的方法 Mehtod[] getMethods()获得一个类的所有的public类型的方法Mehtod getDeclaredMethod(String name Class[] params)使用指定的参数类型获得由name参数所指定的由这个类声明的方法 Method[] getDeclaredMethods() 获得这个类所声明的所有的方法与属性字段的调用一样 前两个方法返回通过这个类的实例可以访问的public类型的方法包括那些继承于超类的方法 后两个方法返回由这个类直接声明的方法的信息 而不管方法的访问类型 通过调用返回的Java lang reflect Mehtod实例定义了一个invoke方法 你可以使用它来调用定义类的有关实例 这个invoke方法需要两个参数 一个是提供这个方法的类的实例 一个是调用这个方法所需要的参数值的数组 下面给出了比属性字段的例子更加深入的例子 它显示了一个的方法反射的例子 这个方法使用get和set方法来给JavaBean定义的int类型的属性做增量 *** 作 例如 如果对象为一个整数类型count属性定义了getCount和setCount方法 那么为了给这个属性做增量运算 你就可以把 count 做为参数名传递给调用的这个方法中 示例代码如下 public int incrementProperty(String name Object obj) {String prop = Character toUpperCase(name charAt( )) +name substring( );String mname = get + prop;Class[] types = new Class[] {};Method method = obj getClass() getMethod(mname types);Object result = method invoke(obj new Object[ ]);int value = ((Integer)result) intValue() + ;mname = lishixinzhi/Article/program/Java/hx/201311/26154

巴甫洛夫早先致力于研究狗的消化系统。他发现,当把食物置入狗的胃里时,胃壁会分泌胃液以促进消化。一系列研究表明,胃液分泌的数量和持续的时间,是随放入胃里的食物的种类和数量而变化的。为了清楚地测定胃里发生的变化,巴甫洛夫以其精湛的外科手术,使狗的胃一部份外露出来。他把狗胃的一部分组织切开,接着在躯体一边切开一个洞口,外面再连接一个囊袋。这样,狗实际上就有了两个胃:一个是原来的胃,其绝大部分组织都仍在起着它的基本功能;另一个是通过手术连接在外面的小胃(或称为“巴甫洛夫囊袋(Pavlovian Pouch)”),这个囊袋的内部是可以观察到的。巴甫洛夫发现,囊袋分泌的情况与胃的分泌活动完全一样。完成了这些准备工作后,巴甫洛夫就能了解消化过程的细节。他也由此获得了诺贝尔医学奖。

巴甫洛夫根据实验研究得出的基本结论是:动物有一种固有的生理反射,它以一种非常精确的方式随胃里食物的种类和数最进行胃液分泌。这一结论也适用于唾液分泌,因为狗唾液分泌的情况,是与嘴里食物的种类和数量完全吻合的。例如,当嘴里有食物时会分泌一种稠的唾液以开始消化过程,而当在嘴里滴一点酸液时,就会分泌大量淡的唾液以稀释酸液。 巴甫洛夫在实验过程中遇到了一种新的情况。如果把狗的食管切开,从颈部移到外部,这样,食物可以咀、可以咽,但不会到胃里去,而是从颈部流了出去。巴甫洛夫发现,狗的胃液分泌几乎仍然像食物进入胃一样多。这就使他得出结论:引起反射性分泌的刺激,不仅可以是胃里的食物(即适当的刺激(appropriate stimulus)),而且还可以是嘴里的食物(即信号刺激(signaling stimulus))。 巴甫洛夫后来又发现,引起狗胃液分泌活动的,可以是狗原先吃过食物的盘子,甚至只要看到以前喂过食物的人,也会引起胃液分泌活动。这种情况完全不同于属于生理反射的那种分泌活动。巴甫洛夫由此认为,存在着两种反射:一种是生理反射(physiological reflex),这是一种内在的、任何动物的所有成员都会表现出来的反射,它们是神经系统固有组织的一部分;另一种是心理反射(psychic reflex),后来他改称为条件反射(conditioned reflex),这种反射是特定动物作为特定经验的结果而产生的。例如,所有狗在胃里有食物时都会分泌胃液,但只有那些具有某种经验的狗才会在听到铃声时产生胃液分泌活动。

现在我们来看看经典条件作用的实验,他把狗用一副套具固定住,唾液是用联结在狗颚外侧的管道收集的,管道连结到一个既可以测量以立方厘米计的总量、也可以记录分泌的滴数的装置。如前所述,当狗嘴里有食物时,会产生分泌唾液的反应。这种反应是本能固有的,巴甫洛夫把这种食物称为无条件刺激,简称“UCS”,把反射性唾液分泌称为无条件反射,简称“UCR”。为了使狗对某一种刺激(如铃声)形成条件作用,把这种原来只会引起探索性反射的中性刺激(即铃声)与无条件刺激(即肉)配对。经过一系列配对尝试后,单是发出铃声,不提供肉,也能引起狗产生唾液分泌。在这种情况下,铃声就成了条件刺激,简称“CS”,铃声引起的唾液分泌就是条件反射,简名“CR”。由此可见,条件反射仅仅是由于条件刺激与无条件刺激配对呈现的结果。

需要指出的是,在巴甫洛夫看来,重要的是引起反射的刺激,反射之后的结果是没有任何理论上的意义的。这样,尽管巴甫洛夫和桑代克都在分析刺激与反应之间的联系,但他俩对形成这种联系的程序以及对学习过程的解释是完全不同的,我们可以用下列程式来比较巴甫洛夫与桑代克的实验程序:

由于巴甫洛夫的无条件刺激(UCS)与桑代克强化刺激(S’)呈现的时间和所起的作用不同,前者可以说是一种刺激辨别学习,后者则是通过强化刺激加强刺激一反应的联结,因此,如果我们把巴甫洛夫的无条件刺激称为强化物,容易引起某种混淆。

以上就是关于C#中的引用问题全部的内容,包括:C#中的引用问题、Java动态程序设计——反射介绍、巴甫洛夫经典条件反射实验的材料、过程、结论是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10092715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存