如何通过 反射 调用某个对象的私有方法?
咨询区
Jeromy Irvine
我的类中有一组私有方法,我现在想根据灵活的输入值来动态调用其中的私有方法,代码类似是这个样子。
MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType);
dynMethod.Invoke(this, new object[] { methodParams });
代码跑起来后,我发现 dynMethod 并没有返回结果,请问我该如何配置才能正确的返回?
回答区
cod3monk3y
如果你真的想解决这个问题,个人建议你写个扩展方法,比如下面这样。
static class AccessExtensions
{public static object call(this object o, string methodName, params object[] args){var mi = o.GetType ().GetMethod (methodName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance );if (mi != null) {return mi.Invoke (o, args);}return null;}
}
然后可以这样使用
class Counter{public int count { get; private set; }void incr(int value) { count += value; }}[Test]public void making_questionable_life_choices(){Counter c = new Counter ();c.call ("incr", 2); // "incr" is private !c.call ("incr", 3);Assert.AreEqual (5, c.count);}
Owen James
微软最近修改了 反射API
,在新的反射模式和平台下,大概是这么写的。
obj.GetType().GetTypeInfo().GetDeclaredMethod("MethodName").Invoke(obj, yourArgsHere);
实践中最好还是封装成一个泛型方法
,比如下面这样。
public static object InvokeMethod<T>(this T obj, string methodName, params object[] args)
{var type = typeof(T);var method = type.GetTypeInfo().GetDeclaredMethod(methodName);return method.Invoke(obj, args);
}
注意:
如果你需要调用的方法是在 obj 的基类中,那这里的泛型参数
T
要显式定义为基类。如果你需要调用的方法是一个
异步方法
, 你可以使用await (Task) obj.InvokeMethod(…)
。
点评区
确实微软已经优化了各种 反射Api
,使用起来虽然较慢,但相比以前要好很多了。
如何通过 反射 调用某个对象的私有方法?相关推荐
- 利用java反射调用类的的私有方法
http://blog.csdn.net/sunyujia/article/details/2501709 今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根 ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...
- 两个线程调用同一个对象的同一个方法
两个线程调用同一个对象的同一个方法,会怎么样? public static void main(String[] args) {// System.out.println(String.valueOf ...
- java私有方法单元测试_如何通过java反射的方式对java私有方法进行单元测试
待测试的私有方法: import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.ann ...
- 字符串反射调用与字符串同名函数方法且带任意参数的通用封装
QQ交流群:607330463 GIS开发技术最强交流群 未经允许 禁止转载 可以参考 目录 1 封装的调用代码 2被调用的函数方法 1 封装的调用代码 List<object> o ...
- 利用Java反射机制调用类的私有方法
利用Java反射机制调用类的私有方法 引言 来吧·展示 参考链接 引言 如何调用其他类的私有方法呢? 可以利用Java的反射机制,去调用其他类的私有方法 来吧·展示 package cn.learn. ...
- 关于反射调用方法的一个log
[Loaded sun.reflect.GeneratedMethodAccessor197 from __JVM_DefineClass__] 请问报这个是什么意思? 这是Sun实现的Java标准 ...
- 在C++中反射调用.NET(二)
反射调用返回复杂对象的.NET方法 定义数据接口 上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C+ ...
最新文章
- centos amd双显卡_讯景RX590 AMD 50周年纪念版显卡评测
- int * * a[10] int * (*a)[10]和 int(*a[10])() 是什么意思
- 神策数据受邀参加全国 APP 个人信息保护监管会
- jQuery.parseJSON()函数详解
- mongodb 入门 启动mongodb 无法启动 问题 非正常关闭
- 关于安卓手机访问一些网站或者Fiori应用弹出安装证书的提示
- 量子计算机超越传统计算机位数,量子计算机相对于传统的计算机有着怎样的优势?...
- springboot-增加自定义资源映射
- arcgis缓冲区分析(结合案例)-国家边界缓冲区的建立
- springboot+vue+elementUI 校园志愿者管理系统#毕业设计
- 星空之翼游戏的设计与实现
- 极路由通过SSH添加静态路由表之后无法跳转的问题
- 网站数据常见的获取途径有什么
- ACL 2021 | 基于词依存信息类型映射记忆神经网络的关系抽取
- java png生成webp图片_jpg、png格式的图片转换成webp后颜色失真的问题
- 如何提高论文阅读速度?
- MacOS下在Pycharm中配置Pyqt5工具(2023年新版教程)
- 华为mysql面试题_华为JAVA开发工程师面试经验
- Linux三剑客awk之行和列
- origin修复中_win10系统中Origin Access出错如何修复