反射(Reflection)

反射主要用于在程序运行期间动态解析相关类的类名,命名空间,属性,方法并进行相应操作,以下通过两个简单的例子进行了说明:

示例1:调用程序集内部方法,运行时动态获取相关类的信息,包括类名,命名空间等信息并进行对象的创建及方法的调用:

测试类:

class HI
{
    public string Hi = "HelloWorld";

    public string SayHello_CI()
    {
        return "Hello World!";
    }

    public string SayHello_AC()
    {
        return "How are you!";
    }
}

调用类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting;
using System.Text;
using System.Threading.Tasks;

namespace ReflectionLearning01
{
    class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(HI);

            //Create object using Assembly
            Assembly Assem = type.Assembly;
            Object objAssembly = Assem.CreateInstance("ReflectionLearning01.HI", true);

            //Creare object using Activator
            ObjectHandle handler = Activator.CreateInstance(null, "ReflectionLearning01.HI");
            Object objActvator = handler.Unwrap();

            //Call the function in another class
            string res_ci = (string)type.InvokeMember("SayHello_CI", BindingFlags.InvokeMethod, null, objAssembly, null);
            string res_ac = (string)type.InvokeMember("SayHello_AC", BindingFlags.InvokeMethod, null, objActvator, null);

            string Name = type.Name;
            string FullName = type.FullName;
            string NameSpace = type.Namespace;
            var Assembly = type.Assembly;
            var Module = type.Module;

            Console.WriteLine("ClassName:" + Name);
            Console.WriteLine("ClassFullName:" + FullName);
            Console.WriteLine("NameSpace:" + NameSpace);
            Console.WriteLine("Assembly:" + Assembly);
            Console.WriteLine("Module:" + Module);

            Console.WriteLine(res_ci);
            Console.WriteLine(res_ac);
            Console.ReadLine();

        }
    }
}

运行结果:

示例2:在当前程序集内部调用外部程序集即动态加载DLL,调用其中的方法并返回方法返回值:

新建类库项目HelloWorld,新增类的详细代码如下,生成.dll:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloWorld
{
    public class HI
    {
        public string SayHello(string Hi)
        {
            return Hi+", current time is "+DateTime.Now.ToShortDateString()+",It‘s time to go home!";
        }
    }
}

新建类Windows 控制台程序ReflectionLearning,类的调用信息如下:

PS.不需要添加HelloWorld.dll到当前项目的引用中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting;
using System.Text;
using System.Threading.Tasks;

namespace ReflectionLearning01
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly = System.Reflection.Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "HelloWorld.dll");
            Type type = assembly.GetType("HelloWorld.HI");
            object instance = assembly.CreateInstance("HelloWorld.HI");

            //Parameter list
            Type[] ParmType = new Type[1];
            ParmType[0] = Type.GetType("System.String");
            Object[] parm_obj = new Object[1];
            parm_obj[0] = "HelloWorld!";

            object result = type.GetMethod("SayHello", ParmType).Invoke(instance, parm_obj);

            Console.WriteLine(result);
            Console.ReadLine();

        }
    }
}

拷贝HelloWorld.dll到当前项目,并F5运行,调用成功后的信息如下所示:

到此,两个演示的例子已经完成,希望通过不断的使用,我们都能不断提高!

时间: 2024-10-25 00:35:09

反射(Reflection)的相关文章

C#反射Reflection

反射就是动态获取程序集中的元数据,直接通过.dll来创建对象,调用成员. Type是反射一个重要的类.通过Type获取类中所有信息,包括方法,属性等. 一.Type的简单使用 1.通过typeof(类型名)或类实例.GetType()的方式获取某个类型的Type. 2.通过GetFields方法可以获取类型中的所有属性. 3.Activator.CreateInstance(类型的Type)可以创建类型的实例. 4.IsInstanceOfType(),判断是否是某一类型的的实例. 5.IsAs

代理(Proxy)和反射(Reflection)

前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了Object.defineProperty()方法来支持开发者去做JS引擎早就可以实现的事情.ES6添加了一些内建对象,赋予开发者更多访问JS引擎的能力.代理(Proxy)是一种可以拦截并改变底层JS引擎操作的包装器,在新语言中通过它暴露内部运作的对象,从而让开发者可以创建内建的对象.本文将详细介绍代

公共技术点之 Java反射 Reflection

公共技术之 Java反射 Reflection 1. 了解Java中的反射 1.1 什么是Java的反射 Java反射是可以让我们在运行时获取类的函数.字段.父类.接口等Class内部信息的机制.通过反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值,即使方法或字段是私有的的也可以通过反射的形式调用,这种"看透class"的能力被称为内省,这种能力在框架开发中尤为重要. 有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此

代理(Proxy)和反射(Reflection) (转)

转自:http://www.cnblogs.com/xiaohuochai/p/7268600.html 前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了Object.defineProperty()方法来支持开发者去做JS引擎早就可以实现的事情.ES6添加了一些内建对象,赋予开发者更多访问JS引擎的能力.代理(Proxy)是一种可以拦截并改变底层

JAVA学习笔记(六十一)- 反射Reflection

反射Reflection import java.lang.reflect.Modifier; /* * 反射Reflection * java.lang.Class类 */ public class Test01 { public static void main(String[] args) { String name = "tom"; // 方式一:通过对象getClass()方法 // 任意一个类的对象,都有一个getClass()方法 // 可以通过此获取获取当前对象的类型所

Java学习笔记之反射(Reflection)

什么是反射 能够分析类能力的程序称为反射(reflection) 反射可以用来干什么 Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息. - 在运行中分析类的能力 - 在运行中查看对象 - 实现通用的数组操作代码 - 利用Method对象 Class类 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着这个对象所属的类.可以通过专门的Java类访问这些信息,保存这些信息的类被

C# 反射Reflection——反射反射程序员的快乐

一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Net-ORM-IOC-AOP 几乎所有的框架都离不开反射 如下图是程序执行的过程,高级语言经过编译器编译得到dll/exe文件,这里的文件可以跨平台使用,编译后的文件中其实包括了metadata元数据(数据清单,描述了DLL/exe里面的各种信息)和IL(也是一种面向对象语言,但是不太好阅读)在经过C

c#之反射(Reflection)

一.反射是什么 反射就是.Net FrameWork框架为我们提供的一个帮助类库,它可以读取我们通过编译后生成的dll和exe文件里面metadate的信息. 反射可以动态的加载dll和exe文件,动态的创建对象,动态的调用方法,动态的获取属性的值和为属性赋值等等...... 二.通过反射获取信息 在C#程序中,我们可以用 System.Reflection 命名空间下的 Assembly 类来加载dll文件,从而来获取里面的信息,代码如下: Assembly assembly = Assemb

Spring基础之 反射(Reflection)

1.了解Class package com.inspire.reflection.Class_api; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ClassUtils { public static void main(String[] args) { String s="abc"; printcl