如何调用封装的私有方法或私有对象

一般情况下,一个对象的私有方法或私有属性,是无法调用的,但在开发过程中,突然发现我们要钻牛角了,你不准调,但我一定要调

例前段时间,在项目中客户提出了能对报表的列进行顺序调整,并且同一台机子上不同的账号登录修改后的保存能独立,这个好解决应用微软的CacheManager能很好的解决,牛角来了。。。。如果我要在项目中删除所有关于某个报表的记忆缓存咋办,可是只有一个公共的Remove(String
Key)方法;问题是Key我用的是用户账号,我不想循环系统所有的账号去删除。。。。。

在调试过程我发现CacheManager这个对象里面有一个私有对象“realCache”,包含了所有的Key对象,如是解决办法之一如下:

System.Type type = cache.GetType();//cache为CacheManager对象

FieldInfo fi = type.GetField("realCache", BindingFlags.NonPublic |
BindingFlags.Instance);//realCache 为封装的私有属性,

Microsoft.Practices.EnterpriseLibrary.Caching.Cache _cache =
(Microsoft.Practices.EnterpriseLibrary.Caching.Cache)fi.GetValue(cache);//对象强制转换

System.Collections.Hashtable table =
_cache.GetType().GetProperty("CurrentCacheState").GetValue(_cache, null) as
System.Collections.Hashtable;//CurrentCacheState对象包含了我想要的

System.Collections.IDictionaryEnumerator enumerator =
table.GetEnumerator();
while
(enumerator.MoveNext())
           
{
               
Microsoft.Practices.EnterpriseLibrary.Caching.CacheItem item = enumerator.Value
as
Microsoft.Practices.EnterpriseLibrary.Caching.CacheItem;
               
if (item !=
null)
               
{
                   
SupcanTemplates templates = item.Value as
SupcanTemplates;//这个SupcanTemplates是我缓存的对象
                
if (templates !=
null)
                   
{
                       
templates.RemoveTemplate(templateId);//templateId是我对应的报表ID
              
  }
               
}
            }

原理通了很简单,如下面这个是我要调用别人的一个私有方法:

protected virtual void OnHotKey(object sender, KeyEventArgs
e)
       
{
            string
funcName = Enum.GetName(typeof(Keys),
e.KeyCode);
           
Type thisType =
this.GetType();
           
MethodInfo func = thisType.GetMethod(funcName,BindingFlags.Instance|
BindingFlags.IgnoreCase
|
               
BindingFlags.Static |
BindingFlags.NonPublic);
           
if (func !=
null)
           
{
               
object[] parameters=new 
object[]{sender,e};
               
func.Invoke(this,
parameters);
           
}
          

        }

这是我第一次发,希望能够帮助到大家,以后会有更多的分享

如何调用封装的私有方法或私有对象,布布扣,bubuko.com

时间: 2024-12-22 10:37:17

如何调用封装的私有方法或私有对象的相关文章

Objective-C的面向对象中,类有真正的私有方法和私有属性么?

在Java/C#等面向对象语言中,方法的访问权限可以通过public/private/protected来控制其访问权限.而在OC中,方法却并没有访问修饰符.那么,我们有没有办法使其方法变为私有? 1. 如果一个方法不在头文件中声明,那么这个方法在编译期,通过[receiver MethodName]的形式向对象发送消息,编译器会有警告,告诉你未找到该方法,但是实际运行时,依然可以正常运行 原因:编译时,即使这个方法不在头文件中声明,编译器仍然会将方法的签名编译进类的方法列表中, 发送消息时,会

python私有方法和私有属性属性理解

私有属性.方法--Python并没有真正的私有化支持,但可用下划线得到伪私有尽量避免定义以下划线开头的变量   (1)_xxx      "单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象(即类实例)和子类对象自己能访问到这些变量,需通过类提供的接口进行访问:不能用'from module import *'导入   (2)__xxx    类中的私有变量/方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通.)," 双下划线 " 开始的

Python中私有方法和私有属性

1.私有方法和私有属性私有方法只能在类内部被调用,不能被对象使用私有属性只能在类内部使用,不能被对象使用 私有属性只能在类内部使用,对象不能使用,但是,我们可以通过在类内部定义公有方法对私有属性进行调用或修改,然后对象在调用这个公有方法使用.###私有属性和私有方法#########在属性名和方法名前面加上 __ class Person(object): def __init__(self): # 公有属性 self.name = "李四" #私有属性 self.__age = 18

python 之简单聊聊私有方法和私有字段

# -*- coding: utf-8 -*- """ Created on Sun Nov 13 23:19:03 2016 @author: toby """ #知识点:私有方法和私有字段 ''' 应用场景: 不想被外部访问的东西,或者说不想暴露给外部的时候 那么就可以定义私有方法或私有字段 ''' class Province:     memo = 'One of China\'s 23 provinces' #静态字段         

OC-私有方法和私有变量

以前没有太注意这个私有方法和私有变量,后来吃了很多亏, 今小总结一下: 1> 私有方法 概念:就是没有在.h文件中声明,只在.m文件实现的方法. 使用:私有方法只能在本类中使用,不能在子类和分类中使用. 2>私有变量 概念1:就是在.m文件中定义的变量 概念2:就是通过@property自动生成的私有成员变量; 使用:私有变量也是只能在本类中使用,分类和子类都不能使用. 3>声明为私有的变量 概念:声明为私有的变量,就是在.h文件中,定义的成员变量之前修饰符为@private. 使用:

coffeescript 继承、私有方法、私有属性、公共方法、公共属性、静态方法、静态属性实现

class Parent constructor: -> _privateAttr = 'privateAttr' _privateFun = ()-> console.log "Parent::privateFun log #{_privateAttr}" publicAttr: 'publicAttr' publicFun: ()-> _privateFun() console.log "Parent::publicFun log #{@publicAt

反射获取一个类的私有方法

今天在刷面试题的时候,发现一个题目是编写程序通过反射获取一个类的私有方法,因为之前学反射的时候也学的浅,没有考虑到这样的事情.今天敲了一下,虽然也就是那么几行代码,还是磕磕绊绊的,最后终于搞定了,这里总结一下 Java反射得到一个类的私有方法 获得私有方法的流程是 (1)获取目标类 (2)获取目标方法 Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法) Method method=clazz.getMeth

mock中测试私有方法,不是mock

Method method = PowerMockito.method(CategoryController.class, "getCategory",List.class);//创建调用CategoryController类中的getCategory私有方法的method对象,参数是list对象 List<Category> category_all_actual = (List<Category>)method.invoke(categoryControll

iOS动态性 运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)

借助前辈的力量综合一下资料. OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是私有方法以及私有属性都是可以动态修改的.本文旨在对runtime的部分特性小试牛刀,更多更全的方法可以参考系统API文件<objc/runtime.h>,demo例子可以参见CSDN的runtime高级编程系列文章. 我们出发吧! 先看一个非常平常的Father类: #import <Fou