初探反射

Posted 【我是谁】

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初探反射相关的知识,希望对你有一定的参考价值。

一、程序集

①动态加载程序集
 Assembly ams = Assembly.LoadFile(@"xxx.dll");
②获取指定类型所在的程序集,一般获取之后是为了获取反射其它类型
typeof(TestAttribute).Assembly
③获取程序集所在的Type
  //1.0获取所有类型
  ams.GetTypes()
 //2.0获取所有public类型
 ams.GetExportedTypes()
 //获取指定类型的Type,如以下获取Person的,参数是完全限定名称(命名空间(项目右击属性查看,一般和程序集名相同)+类名)
   Type typePerson = ams.GetType("PersonNameSPace.Person");

二、动态调用方法

①获取
//会全部获取出来,包括继承object的,属性(本质就是方法)
MethodInfo[] methods = typePerson.GetMethods();
for (int i = 0; i < methods.Length; i++)
{
Console.WriteLine(methods[i].Name);
}
②获取指定的并且调用
          var methodSayHi= typePerson.GetMethod("SayHi");
            //第一个参数是类型对象,第二个是方法参数;
           //调用就跟委托一样Invoke
            methodSayHi.Invoke(Activator.CreateInstance(typePerson), null);
            Console.ReadKey();

三、方法参数,构造函数有多个或者重载怎么办?

//需要在获取方法的时候指定参数有哪些类型,类型顺序一定要一致
var methodSayHi= typePerson.GetMethod("SayHi",new Type[]{typeof(string)});
 methodSayHi.Invoke(Activator.CreateInstance(typePerson), new object[] { "xxx" });

四、为属性赋值

 var nameProp= typePerson.GetProperty("Name");
            var obj=Activator.CreateInstance(typePerson);
            nameProp.SetValue(obj, "123");//设置值
            Console.WriteLine(nameProp.GetValue(obj));//获取值

五、创建对象

实现1:调用无参构造函数:object obj=  Activator.CreateInstance(typePerson);
实现2:调用有参构造函数
1、通过type类型获取指定的构造函数,参数是构造函数的参数的type类型数组(按顺序)
  构造函数:  public Person(int age,string name)
       {   this.Age = age;  this.Name = name;       }
2、获取此构造函数并且调用
ConstructorInfo ctor=  typePerson.GetConstructor(new Type[] {typeof(int),typeof(string)});
object obj= ctor.Invoke(new object[] { 19, "XXX" });
//获取之后就能调用方法等操作了,比如:
调用方法:
MethodInfo info = typePerson.GetMethod("SayHi");
info.Invoke(obj,null);

六、获取非public的方法,就把sayhi方法改为私有的再测试

Person p = new Person();
Type typePerson = typeof(Person);
MethodInfo method = typePerson.GetMethod("SayHi", BindingFlags.NonPublic | BindingFlags.Instance);
method.Invoke(Activator.CreateInstance(typePerson), null);
Console.WriteLine("ok");
Console.ReadKey();

 

以上是关于初探反射的主要内容,如果未能解决你的问题,请参考以下文章

java反射初探

Java讲课笔记36:初探反射机制

初探反射

javajava反射初探 ——“当类也照起镜子”

初探反射

Java反射初探 ——“当类也学会照镜子”