博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
私有方法是封闭的?使用反射来调用一个对象的私有方法。
阅读量:6565 次
发布时间:2019-06-24

本文共 1471 字,大约阅读时间需要 4 分钟。

当我们学习C# 时接触的第一套关键字 可能就是 Private, Public, protect。

Private的定义是: 用此关键字定义的方法和变量只能在对象内部使用。

但是这是绝对的么?有没有办法在调用者的空间中使用Private定义的方法或者变量呢?

让我们定义如下一个类:

  1. public class testObj
  2. {
  3.     public string PublicValue { get; set; }
  4.     private string _privateValue;
  5.  
  6.     public testObj()
  7.     {
  8.         _privateValue = "private";
  9.         PublicValue = "public";
  10.     }
  11.  
  12.     public testObj(string value)
  13.     {
  14.         _privateValue = "private_" + value;
  15.         PublicValue = "public_" + value;
  16.     }
  17.  
  18.     private string returnPrivateValue()
  19.     {
  20.         return _privateValue;
  21.     }
  22. }

那在这个简单程序中我们可以访问_priavateValue么?

  1. static void Main(string[] args)
  2. {
  3.     testObj to = new testObj("test");
  4.     Console.WriteLine("obj public parameter:{0}",to.PublicValue);
  5.     Console.WriteLine("obj public parameter:{0}", to. returnPrivateValue());
  6.  
  7.     Console.Read();
  8. }

当我们尝试编译这段简单程序时会得到一个编译错误。

'PrivateCallByReflection.testObj.returnPrivateValue()' is inaccessible due to its protection level

那么private 真的就是安全的,只能内部访问的么?

一个小小的trick即可得到我们想要的结果

  1. static void Main(string[] args)
  2. {
  3.     testObj to = new testObj("test");
  4.     Console.WriteLine("obj public parameter:{0}",to.PublicValue);
  5.     //Console.WriteLine("obj public parameter:{0}", to.returnPrivateValue());
  6.  
  7.     MethodInfo privateMethod = typeof(testObj).GetMethod("returnPrivateValue", BindingFlags.Instance | BindingFlags.NonPublic);
  8.     Console.WriteLine("obj private method 'returnPrivateValue' return :{0}", privateMethod.Invoke(to, new object[] { }));
  9.  
  10.     Console.Read();
  11. }

请注意下划线标示的代码。

反射帮助我们访问了一个Private的方法。

无下限的反射,真的是没什么不可以的。。。。。

转载于:https://www.cnblogs.com/moshe/p/4488291.html

你可能感兴趣的文章
Python基础学习(第2天)
查看>>
javascript延迟加载及异步(defer和async)
查看>>
我理解的关于Vue.nextTick()的正确使用
查看>>
各种算法优劣对比
查看>>
文件包含
查看>>
【整理】数组面试题集锦
查看>>
hbase命令备忘
查看>>
uni-app 调用支付宝支付
查看>>
MySQL主备停机步骤与注意事项
查看>>
Web服务及http协议
查看>>
算法导论——基本的图算法
查看>>
先排序然后union all失效,mysql数据库多个表union all查询并排序的结果为什么错误...
查看>>
《几何与代数导引》习题1.34.2
查看>>
陶哲轩实分析引理18.4.2:半空间是可测集
查看>>
UI<10> - UISegmentControl<10>
查看>>
多继承之MRO
查看>>
Dubbo的应用
查看>>
volatile在外设寄存器基地址定义时的作用
查看>>
前线解释多线程之委托《三》
查看>>
c#连接MySql数据库的两种方法
查看>>