星空网 > 软件开发 > ASP.net

私有方法是封闭的?使用反射来调用一个对象的私有方法。

当我们学习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的方法。

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




原标题:私有方法是封闭的?使用反射来调用一个对象的私有方法。

关键词:反射

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

推荐找准关键词的5种方法!:https://www.ikjzd.com/articles/95802
亚马逊无货源模式你真的了解吗?:https://www.ikjzd.com/articles/95803
选对产品时机,站外日出百单并不难!:https://www.ikjzd.com/articles/95804
赶跟卖越赶越多?这还算轻的,黑心服务商又出新损招!:https://www.ikjzd.com/articles/95807
警惕!细数CPC的那些坑!:https://www.ikjzd.com/articles/95808
图文实操:​如何监测竞争对手的Facebook广告?(下):https://www.ikjzd.com/articles/95811
无锡旅游景点竹海 - 无锡的竹海:https://www.vstour.cn/a/363178.html
5月贾汪好玩的地方 贾汪哪有好玩的地方:https://www.vstour.cn/a/363179.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流