.net 反射访问私有变量和私有方法

以下为本次实践代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Linq;
 5 using System.Reflection;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8
 9 namespace ConsoleTest
10 {
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             //反射读取类私有属性
16             Person per = new Person("ismallboy", "20102100104");
17             Type t = per.GetType();
18             //获取私有方法
19             MethodInfo method = t.GetMethod("GetStuInfo", BindingFlags.NonPublic | BindingFlags.Instance);
20             //访问无参数私有方法
21             string strTest = method.Invoke(per, null).ToString();
22             //访问有参数私有方法
23             MethodInfo method2 = t.GetMethod("GetValue", BindingFlags.NonPublic | BindingFlags.Instance);
24             object[] par = new object[2];
25             par[0] = "ismallboy";
26             par[1] = 2;
27             string strTest2 = method2.Invoke(per, par).ToString();
28
29             //获取私有字段
30             PropertyInfo field = t.GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Instance);
31             //访问私有字段值
32             string value = field.GetValue(per).ToString();
33             //设置私有字段值
34             field.SetValue(per, "new Name");
35             value = field.GetValue(per).ToString();
36         }
37     }
38
39     /// <summary>
40     /// 个人信息
41     /// </summary>
42     class Person
43     {
44         private string Name { get; set; }
45         private string StuNo { get; set; }
46
47         public Person(string name, string stuNo)
48         {
49             this.Name = name;
50             this.StuNo = stuNo;
51         }
52
53         private string GetStuInfo()
54         {
55             return this.Name;
56         }
57
58         private string GetValue(string str, int n)
59         {
60             return str + n.ToString();
61         }
62     }
63 }

如果使用dynamic的话,也可以如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Linq;
 5 using System.Reflection;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8
 9 namespace ConsoleTest
10 {
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             //反射读取类私有属性
16             dynamic per = new Person("ismallboy", "20102100104");
17             Type t = per.GetType();
18             //获取私有方法
19             MethodInfo method = t.GetMethod("GetStuInfo", BindingFlags.NonPublic | BindingFlags.Instance);
20             //访问无参数私有方法
21             string strTest = method.Invoke(per, null);
22             //访问有参数私有方法
23             MethodInfo method2 = t.GetMethod("GetValue", BindingFlags.NonPublic | BindingFlags.Instance);
24             object[] par = new object[2];
25             par[0] = "ismallboy";
26             par[1] = 2;
27             string strTest2 = method2.Invoke(per, par);
28
29             //获取私有字段
30             PropertyInfo field = t.GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Instance);
31             //访问私有字段值
32             string value = field.GetValue(per);
33             //设置私有字段值
34             field.SetValue(per, "new Name");
35             value = field.GetValue(per);
36         }
37     }
38
39     /// <summary>
40     /// 个人信息
41     /// </summary>
42     class Person
43     {
44         private string Name { get; set; }
45         private string StuNo { get; set; }
46
47         public Person(string name, string stuNo)
48         {
49             this.Name = name;
50             this.StuNo = stuNo;
51         }
52
53         private string GetStuInfo()
54         {
55             return this.Name;
56         }
57
58         private string GetValue(string str, int n)
59         {
60             return str + n.ToString();
61         }
62     }
63 }
时间: 2024-12-23 11:38:25

.net 反射访问私有变量和私有方法的相关文章

Java Reflection(七):私有变量和私有方法

转载自并发编程网 – ifeve.com 内容索引访问私有变量访问私有方法 在通常的观点中从对象的外部访问私有变量以及方法是不允许的,但是Java反射机制可以做到这一点.使用这个功能并不困难,在进行单元测试时这个功能非常有效.本节会向你展示如何使用这个功能. 注意:这个功能只有在代码运行在单机Java应用(standalone Java application)中才会有效,就像你做单元测试或者一些常规的应用程序一样.如果你在Java Applet中使用这个功能,那么你就要想办法去应付Securi

oc中私有变量、私有方法

oc中私有变量.私有方法 私有变量 私有变量既是类的成员变量,仅能在类的内部使用,不受外部访问 定义方法有: 1. 定义在.h文件的{}中,使用关键字@private,如: @interface Test () { @private NSString *string_; } @end 1 2 3 4 5 6 2.也是定义在.h文件的{}中,但不使用关键字@private 3.定义在.m文件的@property,如下: @interface Test () @property (nonatomic

函数中的私有变量和特权方法

定义 [1][私有变量] 任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数外部访问这些变量.私有变量包括函数的参数.局部变量和在函数内部定义的其他函数 [2][特权方法] 如果在函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量.而利用这一点,就可以创建用于访问私有变量的公有方法.有权访问私有变量和私有函数的公有方法称为特权方法. 创建方式 [1][构造函数] 在构造函数内部定义所有私有变量和函数.然后,创建能够访问这些私有成员的特权方法.能够在构造函数中定义特权方法

Object-C 中私有变量和私有方法

1.在OC中有私有变量和私有方法,声明变量的时候 使用 @private 关键字 仍然可以使用指向运算符来 查看,如下: @interface Clip : NSObject { @private int _cbullet; int _times; } 在main.m 中仍可以使用p->_cbullet; 来查看,但是无法访问. 在OC中 @interface和@implementation 都可以定义实例变量. #import "Clip.h" @implementation

递归、闭包、私有变量、特权方法、单例、模块模式(module pattern)

//使用命名函数表达式实现递归 var factorial = (function f(num) {     if (num <= 1) {         return 1;     } else {         return num * f(num - 1);     } }); //用作块级作用域(私有作用域)的匿名函数 (function(){     var now = new Date();     if (now.getMonth() == 0 && now.get

19. Python 类的重写 &nbsp; 类的私有变量和私有方法

1.类的重写 例子: class parent(object):     name = 'parent'     age = 100     def __init__(self):         print('my name is parent')     def get_name(self):         return self.name     def get_age(self):         return self.age class child(parent):     nam

python 类的私有变量和私有方法

#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/11/08 8:46 # @Author : lijunjiang # @File : class3.py """ 类的私有变量和私有方法 在Python中可以通过在属性变量名前加上双下划线定义属性为私有属性 特殊变量命名 1. _xx 以单下划线开头的表示的是protected类型的变量.即保护类型只能允许其本身与子类进行访问.若内部变量标示,如: 当使用

类的私有变量和私有方法

类的私有变量和私有方法 格式:双下划线+变量名/方法名,变量分为静态变量和动态变量 私有变量和方法只能在本类中的方法内调用,不能在类以外调用 私有变量和方法也不能通过类来继承,不能通过子类调用 如果希望通过对象直接调用私有变量和方法,可以使用**obj._类名__变量名/方法名**来调用,但是这种方法是python3的一个bug,工作中不能使用. class Person(object): skin_color = '黄色' __num = 'one' # __变量名表示的是私有的静态字段 de

javascript在私有作用域中定义私有变量和私有函数 (1)

javascript没有私有成员,但是有私有变量,所有对戏那个属性都是公有的 任何在函数中定义的变量,都可以认为是私有变量,因为函数内部不能访问. 私有变量包括:函数的参数.局部变量.函数内部定义的其他函数 - 在私有作用域中定义私有变量和私有函数 function MyObject(){ //私有变量和私有函数 var privateVariable=10; function privateFunction(params) { return false } //特权方法----有权访问私有变量

两种创建私有变量、私有方法的方法

在构造函数中定义特权方法: 利用函数的块级作用域,然后在里面创建了两个特权方法,两个特权方法作为构造函数的闭包可以访问到私有变量name,所以创建构造函数的实例之后只能通过这两个特权方法访问到name这个私有变量(并且每个实例的name不是同一个) 在私有作用域中创建构造函数 首先创建了一个私有作用域,然后在里面创建了一个构造函数,不是用声明式而是用函数表达式创建了一个私有作用域的闭包,这样Person就是一个全局变量,然后通过原型创建了两个特殊方法,然后私有变量name就只能通过这两个方法访问