可以通过类名、成员的名字来进行对象的实例化、操作类成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
class Person{
public int a;
private int b;
public static int c;
private static int d;

public Person(){
Console.WriteLine("Person 类无参构造方法被调用");
};
public Person(int a, double b, string c){
Console.WriteLine("Person 类有参构造方法被调用");
};

public void ShowA(){};
private void ShowB(){};
public static void ShowC(){};
private static void ShowD(){};

public int Show(int a, double b){ return a;};
public double Show(double a, int b){ return b;};
}

class Program{
public static void Main(string[] args){
//如果类在命名空间中,类名必须加上命名空间
Type t = Type.GetType("命名空间.Person");

//实例化一个对象,默认会使用 public 权限的无参构造方法
Object obj = Activator.CreateInstance(t);

//实例化一个对象,如果 true 可以匹配任何权限的无参构造方法
Object obj = Activator.CreateInstance(t, true);

//实例化一个对象,通过 public 权限的有参构造方法
Object obj = Activator.CreateInstance(t, 1, 3.2, "hello");

//实例化一个对象,通过非 public 权限的有参构造方法
Object obj = Activator.CreateInstance(t,
System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Instance,
null, new object[]{1, 3.2, "hello"}, null);

/*
* BindingFlags:要访问的方法和字段的权限描述,必须具备两个描述
* 1、要访问的成员的访问权限描述
* 2、要访问的成员的归属
*/

//通过反射访问字段、方法
//1、public 权限,非静态的字段a
FieldInfo a = t.GetField("a");
a.SetValue(obj, 1); //给 obj 对象赋值 1
object aa = a.GetValue(obj); //获取 obj 对象 a 的值

//2、private 权限,非静态的字段b
FieldInfo b = t.GetField("b", BindingFlags.NonPublic
| BindingFlags.Instance);
b.SetValue(obj, 3); //给 obj 对象赋值 3
object bb = b.GetValue(obj); //获取 obj 对象 b 的值

//3、public 权限,静态的字段c
FieldInfo c = t.GetField("c", BindingFlags.Public
| BindingFlags.Static);
c.SetValue(null, 3); //访问静态成员,访问的主体是 null
object cc = c.GetValue(null);

//4、private 权限,静态的字段d
FieldInfo d = t.GetField("c", BindingFlags.NonPublic
|BindingFlags.Static);
d.SetValue(null, 3); //访问静态成员,访问的主体是 null
object dd = d.GetValue(null);

MethodInfo method1 = t.GetMethod("ShowD", BindingFlags.NonPublic
| BindingFlags.Instance);
//方法调用,第一个参数:谁在调用方法;第二个参数:调用的方法的实参列表
method1.Invoke(null, null);

//获取有参数有重载的方法,Type数组中传要访问的方法的参数类型列表
MethodInfo method2 = t.GetMethod("Show", BindingFlags.Public
| BindingFlags.Instance, null,
new Type[]{ typeof(int), typeof(double)}, null);
object res = method2.Invoke(obj, new Type[]{1, 3.12});
}
}