私有方法是封闭的?使用反射来调用一个对象的私有方法。_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 私有方法是封闭的?使用反射来调用一个对象的私有方法。

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

 2015/5/8 22:33:00  默蛇  程序员俱乐部  我要评论(0)
  • 摘要:当我们学习C#时接触的第一套关键字可能就是Private,Public,protect。Private的定义是:用此关键字定义的方法和变量只能在对象内部使用。但是这是绝对的么?有没有办法在调用者的空间中使用Private定义的方法或者变量呢?让我们定义如下一个类:publicclasstestObj{publicstringPublicValue{get;set;}privatestring_privateValue;publictestObj()
  • 标签:方法 使用 一个 反射

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

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

发表评论
用户名: 匿名