反射中常使用得方法

转载 2011年01月21日 20:36:00

如果想复用别人写的.NET程序但手上只有一个编译过的EXE,那么方法之一是用Reflection(反射)。下面是一些例子,初次上手的人可以参考。
  先假设我们要复用的第三方应用程序EXE是由下面的代码编译成的:

view plaincopy to clipboardprint?
  using System;  
  namespace MyNamespace  
  {  
       public class MyApp  
      {  
         public MyNestedObject myNestedObject=null;  
         public class MyNestedObject  
         {  
            public string name;  
         }  
         public enum FourSeasonsEnum  
         {  
            spring,   
            summer,   
            autumn,   
            winter  
         }  
         public MyApp()  
         {  
         }  
         public MyApp(MyNamespace.MyForm form)  
         {  
         }  
         public MyNestedObject Foo1(FourSeasonsEnum season)  
         {  
            return this.myNestedObject;  
         }  
         public string Foo2()  
         {  
            return "";  
         }  
         static void Main()  
         {  
         }  
     }  
     public class MyForm  
     {  
         public MyForm()  
         {  
         }  
     }  
  } 
  using System;
  namespace MyNamespace
  {
       public class MyApp
      {
         public MyNestedObject myNestedObject=null;
         public class MyNestedObject
         {
            public string name;
         }
         public enum FourSeasonsEnum
         {
            spring,
            summer,
            autumn,
            winter
         }
         public MyApp()
         {
         }
         public MyApp(MyNamespace.MyForm form)
         {
         }
         public MyNestedObject Foo1(FourSeasonsEnum season)
         {
            return this.myNestedObject;
         }
         public string Foo2()
         {
            return "";
         }
         static void Main()
         {
         }
     }
     public class MyForm
     {
         public MyForm()
         {
         }
     }
  }
 


  以下是一些直接引用时常见的调用如何用Reflection来改写:
  1. 用不含参数的构造函数生成对象

view plaincopy to clipboardprint?
  直接引用时,代码是  
 
  MyNamespace.MyApp app=new MyNamespace.MyApp();  
 
  用Reflection来调用的话就需要这么写(记得using System.Reflection)  
 
  Assembly assem=Assembly.LoadFile(@"C:/Home/Workspace/MyNamespace/myapp.exe");  
  Type MyAppType=assem.GetType("MyNamespace.MyApp");  
  ConstructorInfo MyAppType_Constructor=MyAppType.GetConstructor(new Type[]{});  
  object app=MyAppType_Constructor.Invoke(new object[]{}); 
  直接引用时,代码是

  MyNamespace.MyApp app=new MyNamespace.MyApp();

  用Reflection来调用的话就需要这么写(记得using System.Reflection)

  Assembly assem=Assembly.LoadFile(@"C:/Home/Workspace/MyNamespace/myapp.exe");
  Type MyAppType=assem.GetType("MyNamespace.MyApp");
  ConstructorInfo MyAppType_Constructor=MyAppType.GetConstructor(new Type[]{});
  object app=MyAppType_Constructor.Invoke(new object[]{});
 

  2. 用含参数的构造函数生成对象
  

view plaincopy to clipboardprint?
    直接引用时,代码是  
 
  MyNamespace.MyApp app=new MyNamespace.MyApp(new MyNamespace.MyForm());  
 
  用Reflection来调用的话就需要这么写  
 
  Assembly assem=Assembly.LoadFile(@"C:/Home/Workspace/MyNamespace/myapp.exe");   
  Type MyAppType=assem.GetType("MyNamespace.MyApp");   
  Type MyFormType=assem.GetType("MyNamespace.MyForm");  
  ConstructorInfo MyAppType_Constructor=MyAppType.GetConstructor(new Type[]{MyFormType});  
  ConstructorInfo MyFormType_Constructor=MyFormType.GetConstructor(new Type[]{});  
  object form=MyFormType_Constructor.Invoke(new object[]{});  
  object app=MyAppType_Constructor.Invoke(new object[]{form}); 
    直接引用时,代码是

  MyNamespace.MyApp app=new MyNamespace.MyApp(new MyNamespace.MyForm());

  用Reflection来调用的话就需要这么写

  Assembly assem=Assembly.LoadFile(@"C:/Home/Workspace/MyNamespace/myapp.exe");
  Type MyAppType=assem.GetType("MyNamespace.MyApp");
  Type MyFormType=assem.GetType("MyNamespace.MyForm");
  ConstructorInfo MyAppType_Constructor=MyAppType.GetConstructor(new Type[]{MyFormType});
  ConstructorInfo MyFormType_Constructor=MyFormType.GetConstructor(new Type[]{});
  object form=MyFormType_Constructor.Invoke(new object[]{});
  object app=MyAppType_Constructor.Invoke(new object[]{form});
 

  3. 调用对象的方法
  

view plaincopy to clipboardprint?
    直接引用时,代码是  
 
  MyNamespace.MyApp app=new MyNamespace.MyApp();  
  string str=app.Foo2();  
 
  用Reflection来调用的话就需要这么写  
 
  Assembly assem=Assembly.LoadFile(@"C:/Home/Workspace/MyNamespace/myapp.exe");  
  Type MyAppType=assem.GetType("MyNamespace.MyApp");  
  ConstructorInfo MyAppType_Constructor=MyAppType.GetConstructor(new Type[]{});  
  object app=MyAppType_Constructor.Invoke(new object[]{});  
  object str=MyAppType.GetMethod("Foo2").Invoke(app,new object[]{}); 
    直接引用时,代码是

  MyNamespace.MyApp app=new MyNamespace.MyApp();
  string str=app.Foo2();

  用Reflection来调用的话就需要这么写

  Assembly assem=Assembly.LoadFile(@"C:/Home/Workspace/MyNamespace/myapp.exe");
  Type MyAppType=assem.GetType("MyNamespace.MyApp");
  ConstructorInfo MyAppType_Constructor=MyAppType.GetConstructor(new Type[]{});
  object app=MyAppType_Constructor.Invoke(new object[]{});
  object str=MyAppType.GetMethod("Foo2").Invoke(app,new object[]{});
 

  4. Set/Get成员变量

view plaincopy to clipboardprint?
  直接引用时,代码是  
 
  MyNamespace.MyApp app=new MyNamespace.MyApp();  
  MyNamespace.MyApp.MyNestedObject obj=app.myNestedObject;  
  MyNamespace.MyApp.MyNestedObject obj2=new MyNamespace.MyApp.MyNestedObject();  
  app.myNestedObject =obj2;  
 
  用Reflection来调用的话就需要这么写(注意,这里的MyNestedObject类是nested type,名字要用"MyNamespace.MyApp+MyNestedObject"而不是"MyNamespace.MyApp.MyNestedObject")  
 
  Assembly assem=Assembly.LoadFile(@"C:/Home/Workspace/MyNamespace/myapp.exe");  
  Type MyAppType=assem.GetType("MyNamespace.MyApp");  
  ConstructorInfo MyAppType_Constructor=MyAppType.GetConstructor(new Type[]{});  
  object app=MyAppType_Constructor.Invoke(new object[]{});  
  Type MyNestedObjectType=assem.GetType("MyNamespace.MyApp+MyNestedObject");  
  FieldInfo MyNestedObjField=MyAppType.GetField("myNestedObject");  
  object obj=MyNestedObjField.GetValue(app);  
     
  ConstructorInfo MyNestedObjectType_Constructor=MyNestedObjectType.GetConstructor(new Type[]{});  
  object obj2=MyNestedObjectType_Constructor.Invoke(new object[]{});  
  MyNestedObjField.SetValue(app,obj2); 
  直接引用时,代码是

  MyNamespace.MyApp app=new MyNamespace.MyApp();
  MyNamespace.MyApp.MyNestedObject obj=app.myNestedObject;
  MyNamespace.MyApp.MyNestedObject obj2=new MyNamespace.MyApp.MyNestedObject();
  app.myNestedObject =obj2;

  用Reflection来调用的话就需要这么写(注意,这里的MyNestedObject类是nested type,名字要用"MyNamespace.MyApp+MyNestedObject"而不是"MyNamespace.MyApp.MyNestedObject")

  Assembly assem=Assembly.LoadFile(@"C:/Home/Workspace/MyNamespace/myapp.exe");
  Type MyAppType=assem.GetType("MyNamespace.MyApp");
  ConstructorInfo MyAppType_Constructor=MyAppType.GetConstructor(new Type[]{});
  object app=MyAppType_Constructor.Invoke(new object[]{});
  Type MyNestedObjectType=assem.GetType("MyNamespace.MyApp+MyNestedObject");
  FieldInfo MyNestedObjField=MyAppType.GetField("myNestedObject");
  object obj=MyNestedObjField.GetValue(app);
  
  ConstructorInfo MyNestedObjectType_Constructor=MyNestedObjectType.GetConstructor(new Type[]{});
  object obj2=MyNestedObjectType_Constructor.Invoke(new object[]{});
  MyNestedObjField.SetValue(app,obj2);
 

  5. 使用枚举类型

view plaincopy to clipboardprint?
  直接引用时,代码是  
 
  MyNamespace.MyApp app=new MyNamespace.MyApp();  
  MyNamespace.MyApp.MyNestedObject obj=app.Foo1(MyNamespace.MyApp.FourSeasonsEnum.spring);  
 
  用Reflection来调用的话就需要这么写  
 
  Assembly assem=Assembly.LoadFile(@"C:/Home/Workspace/MyNamespace/myapp.exe");  
  Type MyAppType=assem.GetType("MyNamespace.MyApp");  
  ConstructorInfo MyAppType_Constructor=MyAppType.GetConstructor(new Type[]{});  
  object app=MyAppType_Constructor.Invoke(new object[]{});  
  Type FourSeasonsEnumType=assem.GetType("MyNamespace.MyApp+FourSeasonsEnum");  
  Array FourSeasonsEnumValues=Enum.GetValues(FourSeasonsEnumType);  
  object SpringValue=FourSeasonsEnumValues.GetValue(0);  
  object result=MyAppType.GetMethod("Foo1").Invoke(app,new object[]{SpringValue}); 
  直接引用时,代码是

  MyNamespace.MyApp app=new MyNamespace.MyApp();
  MyNamespace.MyApp.MyNestedObject obj=app.Foo1(MyNamespace.MyApp.FourSeasonsEnum.spring);

  用Reflection来调用的话就需要这么写

  Assembly assem=Assembly.LoadFile(@"C:/Home/Workspace/MyNamespace/myapp.exe");
  Type MyAppType=assem.GetType("MyNamespace.MyApp");
  ConstructorInfo MyAppType_Constructor=MyAppType.GetConstructor(new Type[]{});
  object app=MyAppType_Constructor.Invoke(new object[]{});
  Type FourSeasonsEnumType=assem.GetType("MyNamespace.MyApp+FourSeasonsEnum");
  Array FourSeasonsEnumValues=Enum.GetValues(FourSeasonsEnumType);
  object SpringValue=FourSeasonsEnumValues.GetValue(0);
  object result=MyAppType.GetMethod("Foo1").Invoke(app,new object[]{SpringValue});
 

  ---
  最后,只要有可能,应该尽量不用Reflection,因为相比起直接调用,Reflection的性能相当差。

反射实例:

 Class1和Form 窗体在同一个命名空间


view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.Text;  
 
namespace fanshetest1  
{  
    class Class1  
    {  
        private string ab="1";  
        public Class1(string aa)  
        {  
            a = aa;  
        }  
        public int  aa(int x,int y)  
        {  
            return x+y+x+y;  
        }  
        public string bb()  
        {  
            return "bb";  
        }  
        public static string cc()  
        {  
            return "cc";  
        }  
        public string AB  
        {  
            get 
            {  
                return ab;  
            }  
            set 
            {  
                ab = value;  
            }  
        }  
        public string a;  
    }  

using System;
using System.Collections.Generic;
using System.Text;

namespace fanshetest1
{
    class Class1
    {
        private string ab="1";
        public Class1(string aa)
        {
            a = aa;
        }
        public int  aa(int x,int y)
        {
            return x+y+x+y;
        }
        public string bb()
        {
            return "bb";
        }
        public static string cc()
        {
            return "cc";
        }
        public string AB
        {
            get
            {
                return ab;
            }
            set
            {
                ab = value;
            }
        }
        public string a;
    }
}
 

Class1和Form 窗体在不同一个命名空间


view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.Text;  
 
namespace fanshetest1  
{  
    class Class1  
    {  
        private string ab="1";  
        public Class1(string aa)  
        {  
            a = aa;  
        }  
        public int  aa(int x,int y)  
        {  
            return x+y+x+y;  
        }  
        public string bb()  
        {  
            return "bb";  
        }  
        public static string cc()  
        {  
            return "cc";  
        }  
        public string AB  
        {  
            get 
            {  
                return ab;  
            }  
            set 
            {  
                ab = value;  
            }  
        }  
        public string a;  
    }  

using System;
using System.Collections.Generic;
using System.Text;

namespace fanshetest1
{
    class Class1
    {
        private string ab="1";
        public Class1(string aa)
        {
            a = aa;
        }
        public int  aa(int x,int y)
        {
            return x+y+x+y;
        }
        public string bb()
        {
            return "bb";
        }
        public static string cc()
        {
            return "cc";
        }
        public string AB
        {
            get
            {
                return ab;
            }
            set
            {
                ab = value;
            }
        }
        public string a;
    }
}
 

下面是如何使用反射操作以上类;

view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Text;  
using System.Windows.Forms;  
using System.Reflection;  
namespace fanshetest  
{  
    public partial class Form1 : Form  
    {  
        System.Reflection.Assembly a;  
        System.Reflection.Assembly b;  
        public Form1()  
        {  
            InitializeComponent();  
            a = System.Reflection.Assembly.LoadFrom("Class1.DLL");  
        }  
 
        private void button1_Click(object sender, EventArgs e)  
        {  
            gouzaohanshu();  
             
 
        }  
       //没有传参数,返回一个类型;  
        private void One()  
        {  
            //再另建一个项目,在项目中引用上面生成的ClassLibrary1.DLL  
            System.Type t = a.GetType("Class1.Class1");  
            //动态生成ClassLibrary1.Class类的实例  
            Object theObj = System.Activator.CreateInstance(t);  
            //参数信息,GetSum需要两个string参数  
            System.Type[] paramTypes = new System.Type[2];  
            paramTypes[0] = System.Type.GetType("System.String");  
            paramTypes[1] = System.Type.GetType("System.String");  
            //System.Reflection.MethodInfo mi = t.GetMethod("aa", paramTypes);  
            System.Reflection.MethodInfo mi = t.GetMethod("bb");  
            //参数值  
            Object[] parameters = new Object[2];  
            parameters[0] = 3;  
            parameters[1] = 4;  
 
            Object returnValue = mi.Invoke(theObj, null);  
            this.textBox1.Text = returnValue.ToString();  
        }  
        //没有返回值,调用的是直接执行函数  
        private void None_void()  
        {  
            //再另建一个项目,在项目中引用上面生成的ClassLibrary1.DLL  
            System.Type t = a.GetType("Class1.Class2");  
            //动态生成ClassLibrary1.Class类的实例  
            Object theObj = System.Activator.CreateInstance(t);  
            //参数信息,GetSum需要两个string参数  
            System.Type[] paramTypes = new System.Type[2];  
            //此处调用方法,如果有参数只需要在括号的后面加上"," 加上参数的type[]类型的参数  
            System.Reflection.MethodInfo mi = t.GetMethod("Mes");  
            Object returnValue = mi.Invoke(theObj, null);  
 
        }  
        //没有返回值,传出参数接收返回值;  
        private void Two()  
        {  
            Type t = a.GetType("Class1.Class1");  
            Object theObj = Activator.CreateInstance(t);  
            Type[] types=new Type[2];  
            types[0]=Type.GetType("System.Int32");  
            types[1]=Type.GetType("System.Int32");  
            Object[] obj=new Object[2];  
            obj[0]=2;  
            obj[1]=3;  
            MethodInfo mi = t.GetMethod("aa",types);  
           Object returnValue=mi.Invoke(theObj,obj);  
           this.textBox1.Text = returnValue.ToString();  
        }  
        //获取同一个命名空间的反射出值  
        private void Local()  
        {  
            Type t=Type.GetType("fanshetest1.Class1");  
            //创建一个 实例  
            Object theObj = Activator.CreateInstance(t);  
            Type[] types=new Type[2];  
            types[0]=Type.GetType("System.Int32");  
            types[1] = Type.GetType("System.Int32");  
            Object[] obj = new Object[2];  
            obj[0] = 2;  
            obj[1] = 3;  
            MethodInfo mi = t.GetMethod("aa",types);  
            Object returnValue = mi.Invoke(theObj,obj);  
            this.textBox1.Text = returnValue.ToString();  
        }  
        //获取出一个属性  
        private void attribute()  
        {  
            a = Assembly.LoadFrom("Class1.dll");  
            Type t = a.GetType("Class1.Class1");  
            t = Type.GetType("fanshetest1.Class1");  
            Object theObj = Activator.CreateInstance(t);  
            t.GetProperty("AB").SetValue(theObj,"a",null);  
            this.textBox1.Text = t.GetProperty("AB").GetValue(theObj, null).ToString();  
        }  
        //获取出静态的函数;  
        private void static_()  
        {  
            a = System.Reflection.Assembly.LoadFrom("Class1.dll");  
            Type t = a.GetType("Class1.Class1");  
            t = Type.GetType("fanshetest1.Class1");  
            //创建一个实例  
            Object theObj = Activator.CreateInstance(t);  
            //创建一个方法的实例  
            MethodInfo mi = t.GetMethod("cc");  
            Object returnValue = mi.Invoke(theObj, null);  
            this.textBox1.Text = returnValue.ToString();  
        }  
        //获取出变量;  
        private void variable()  
        {  
            a = Assembly.LoadFrom("Class1.dll");  
            Type t = a.GetType("Class1.Class1");  
            t = Type.GetType("fanshetest1.Class1");  
            Object theObj = Activator.CreateInstance(t);  
            MethodInfo mi = t.GetMethod("a");  
            t.GetField("a").SetValue(theObj,"a");  
            this.textBox1.Text = t.GetField("a").GetValue(theObj).ToString();  
        }  
        //获取出私有变量反射值;  
        private void private_()  
        {   
              
        }  
        //构造函数  
        private void gouzaohanshu()  
        {  
            Type t = a.GetType("Class1.Class1");  
            t = Type.GetType("fanshetest1.Class1");  
            //创建构造函数类型  
            Type[] structure_Type = new Type[1];  
            structure_Type[0] = Type.GetType("System.String");  
            //定义构造函数传参类型  
            Object[] structure_Obj = new Object[1];  
            structure_Obj[0] = "aa";  
            //创建一个 实例  
            Object theObj = Activator.CreateInstance(t,structure_Obj);  
            //MethodInfo structure_Mi = t.GetConstructor(structure_Type);  
            //MethodInfo structure_Mi = t.GetMethod("Class1", structure_Type);  
            //structure_Mi.Invoke(theObj, structure_Obj);  
 
            MethodInfo mi = t.GetMethod("a");  
            //t.GetField("a").SetValue(theObj, "a");  
            this.textBox1.Text = t.GetField("a").GetValue(theObj).ToString();  
        }  
 
    }  

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
namespace fanshetest
{
    public partial class Form1 : Form
    {
        System.Reflection.Assembly a;
        System.Reflection.Assembly b;
        public Form1()
        {
            InitializeComponent();
            a = System.Reflection.Assembly.LoadFrom("Class1.DLL");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            gouzaohanshu();
          

        }
       //没有传参数,返回一个类型;
        private void One()
        {
            //再另建一个项目,在项目中引用上面生成的ClassLibrary1.DLL
            System.Type t = a.GetType("Class1.Class1");
            //动态生成ClassLibrary1.Class类的实例
            Object theObj = System.Activator.CreateInstance(t);
            //参数信息,GetSum需要两个string参数
            System.Type[] paramTypes = new System.Type[2];
            paramTypes[0] = System.Type.GetType("System.String");
            paramTypes[1] = System.Type.GetType("System.String");
            //System.Reflection.MethodInfo mi = t.GetMethod("aa", paramTypes);
            System.Reflection.MethodInfo mi = t.GetMethod("bb");
            //参数值
            Object[] parameters = new Object[2];
            parameters[0] = 3;
            parameters[1] = 4;

            Object returnValue = mi.Invoke(theObj, null);
            this.textBox1.Text = returnValue.ToString();
        }
        //没有返回值,调用的是直接执行函数
        private void None_void()
        {
            //再另建一个项目,在项目中引用上面生成的ClassLibrary1.DLL
            System.Type t = a.GetType("Class1.Class2");
            //动态生成ClassLibrary1.Class类的实例
            Object theObj = System.Activator.CreateInstance(t);
            //参数信息,GetSum需要两个string参数
            System.Type[] paramTypes = new System.Type[2];
            //此处调用方法,如果有参数只需要在括号的后面加上"," 加上参数的type[]类型的参数
            System.Reflection.MethodInfo mi = t.GetMethod("Mes");
            Object returnValue = mi.Invoke(theObj, null);

        }
        //没有返回值,传出参数接收返回值;
        private void Two()
        {
            Type t = a.GetType("Class1.Class1");
            Object theObj = Activator.CreateInstance(t);
            Type[] types=new Type[2];
            types[0]=Type.GetType("System.Int32");
            types[1]=Type.GetType("System.Int32");
            Object[] obj=new Object[2];
            obj[0]=2;
            obj[1]=3;
            MethodInfo mi = t.GetMethod("aa",types);
           Object returnValue=mi.Invoke(theObj,obj);
           this.textBox1.Text = returnValue.ToString();
        }
        //获取同一个命名空间的反射出值
        private void Local()
        {
            Type t=Type.GetType("fanshetest1.Class1");
            //创建一个 实例
            Object theObj = Activator.CreateInstance(t);
            Type[] types=new Type[2];
            types[0]=Type.GetType("System.Int32");
            types[1] = Type.GetType("System.Int32");
            Object[] obj = new Object[2];
            obj[0] = 2;
            obj[1] = 3;
            MethodInfo mi = t.GetMethod("aa",types);
            Object returnValue = mi.Invoke(theObj,obj);
            this.textBox1.Text = returnValue.ToString();
        }
        //获取出一个属性
        private void attribute()
        {
            a = Assembly.LoadFrom("Class1.dll");
            Type t = a.GetType("Class1.Class1");
            t = Type.GetType("fanshetest1.Class1");
            Object theObj = Activator.CreateInstance(t);
            t.GetProperty("AB").SetValue(theObj,"a",null);
            this.textBox1.Text = t.GetProperty("AB").GetValue(theObj, null).ToString();
        }
        //获取出静态的函数;
        private void static_()
        {
            a = System.Reflection.Assembly.LoadFrom("Class1.dll");
            Type t = a.GetType("Class1.Class1");
            t = Type.GetType("fanshetest1.Class1");
            //创建一个实例
            Object theObj = Activator.CreateInstance(t);
            //创建一个方法的实例
            MethodInfo mi = t.GetMethod("cc");
            Object returnValue = mi.Invoke(theObj, null);
            this.textBox1.Text = returnValue.ToString();
        }
        //获取出变量;
        private void variable()
        {
            a = Assembly.LoadFrom("Class1.dll");
            Type t = a.GetType("Class1.Class1");
            t = Type.GetType("fanshetest1.Class1");
            Object theObj = Activator.CreateInstance(t);
            MethodInfo mi = t.GetMethod("a");
            t.GetField("a").SetValue(theObj,"a");
            this.textBox1.Text = t.GetField("a").GetValue(theObj).ToString();
        }
        //获取出私有变量反射值;
        private void private_()
        {
           
        }
        //构造函数
        private void gouzaohanshu()
        {
            Type t = a.GetType("Class1.Class1");
            t = Type.GetType("fanshetest1.Class1");
            //创建构造函数类型
            Type[] structure_Type = new Type[1];
            structure_Type[0] = Type.GetType("System.String");
            //定义构造函数传参类型
            Object[] structure_Obj = new Object[1];
            structure_Obj[0] = "aa";
            //创建一个 实例
            Object theObj = Activator.CreateInstance(t,structure_Obj);
            //MethodInfo structure_Mi = t.GetConstructor(structure_Type);
            //MethodInfo structure_Mi = t.GetMethod("Class1", structure_Type);
            //structure_Mi.Invoke(theObj, structure_Obj);

            MethodInfo mi = t.GetMethod("a");
            //t.GetField("a").SetValue(theObj, "a");
            this.textBox1.Text = t.GetField("a").GetValue(theObj).ToString();
        }

    }
}
 

      反射是审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等.

      反射的主要作用是用来扩展系统和动态调用程序集。
      所谓扩展系统就是先把系统写好,系统里面定义接口,后面开发的人去写接口的代码。
      此时该系统就要用反射了,系统用反射调用接口,当接口没写,系统利用反射就不会不会出错,此时就等于没实现此功能而已,当接口被人写好了,系统就会自动调用接口的功能展现在系统上。即反射实现即插即用功能。

      动态调用程序集就是利用反射去调用编译好的dll,当然此时的dll没有被引用到你所建的工程里面。
      当你编译你的工程时,不会编译你调用的dll,当你运行到调用dll时,此时才会去调用dll,判断是否有语法语义,等编译,运行的错误。
这样利用反射具有一定灵活性,就是不用从你的工程调用dll,还有就是dll可随时改变(当然接口还是要对应),不需改变你所建的工程。

      总之反射最好的好处就是新建工程时后不须一定要写好dll,可新建完工程后,后期写dll也可以。即所谓后期绑定。当然利用反射是耗资源的,损失效率,如果不是在上面的场合利用此技术,可能不会带来好处,反而是坏处。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/boby16/archive/2009/07/30/4393422.aspx

oracle中常用得函数

--ASCII(char) :计算char的第一个字符的ASCII值或EBCDIC码值 select ASCII('a')  from dual; --CHR(n) :计算ASCⅡ码值或EBCDI...
  • G15738290530
  • G15738290530
  • 2016年11月17日 11:36
  • 155

Java中通过反射越过泛型检查

要想Java通过反射越过泛型检查,你就得先明白,泛型是在什么时候起作用的。 泛型是在编译期间起作用的。在编译后的.class文件中是没有泛型的。所有比如T或者E类型啊,本质都是通过Object处理的。...
  • Marvel__Dead
  • Marvel__Dead
  • 2016年11月21日 19:31
  • 893

struts 中常用得几个类

ActionMapping类将特定请求映射到特定Action的相关信息存储在ActionMapping中,ActionServelt将ActionMapping传送到Action类的execute()...
  • pq5326
  • pq5326
  • 2005年03月21日 14:46
  • 777

利用反射调用方法,以及绕过泛型检查

比如知道一个类的对象,我们知道方法的名称,但是只有在运行的时候才知道调用哪个方法,这样只能用反射的方式调用了,拿List举例 List list = new ArrayList(); 但是我们只有...
  • qq_33802316
  • qq_33802316
  • 2017年07月29日 11:20
  • 175

Java反射技术绕过ArrayList泛型编译期间检查, 将不同类型数据存到一起

测试类: package com.mth.test; import java.lang.reflect.Method; import java.util.ArrayList; import jav...
  • m75100313
  • m75100313
  • 2014年01月07日 00:05
  • 1298

简单限制QQ使用得方法

  一、使用防火墙禁止端口法 我们知道 QQ使用的默认端口是 UDP 4000,使用防火墙将该端口关闭,那么别人就不能使用QQ了,当自己需要上网时只需开放该端口就可以了。 下面以我使用的“金山网镖6”...
  • hjhx__521
  • hjhx__521
  • 2007年12月19日 15:47
  • 946

hibernate继承关系映射和java反射机制的运用

                  hibernate继承关系映射大概有5种,这5种继承关系映射里面,我觉得最有效最常用的一种方式非常好.就说说这种吧.先来说说hibernate继承关系什么时候使用....
  • derpvailzhangfan
  • derpvailzhangfan
  • 2007年12月21日 20:52
  • 4111

通过反射机制调用某个类的方法

要通过反射机制调用某个类的方法,主要用到了下面这个方法: public Object invoke(Object obj,Object... args) 这个方法对带有指定参数的指定对象调用由此 ...
  • Handsome_fan
  • Handsome_fan
  • 2017年02月04日 14:27
  • 4040

工作中常用到的Java反射

这次提到的Java反射涉及的代码比较多。因为工作中经常用到反射,对代码做了很多抽象以及过滤器。虽然代码量很多,但是简单易用,过滤插件也易修改。 下面介绍下工作中哪些地方比较容易用到反射。比如插件...
  • AlbenXie
  • AlbenXie
  • 2017年04月10日 17:44
  • 232

informix使用得一些小常识

在java中连接informix 网上有些关于这个的文章,纯粹扯淡(关于驱动的jar包,解决中文乱码的), 仅需一个jar包, 1,添加驱动 然后如果用maven管理项目 http:...
  • happyzxs
  • happyzxs
  • 2017年11月20日 20:25
  • 128
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反射中常使用得方法
举报原因:
原因补充:

(最多只允许输入30个字)