`
wyf
  • 浏览: 436516 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

一个通用的快速反射方法(A General Fast Method Invoker)

阅读更多

普通反射方法

MethodInfo methodInfo = typeof(Person).GetMethod("Say");

methodInfo.Invoke(new Person(), new object[]{"hello"});
 

 快速反射方法

FastInvokeHandler fastInvoker = GetMethodInvoker(methodInfo);
fastInvoker(new Person(), new object[]{"hello"});

 实现,首先需要定义一个委托:

public delegate object FastInvokeHandler(object target,  object[] paramters);
 
public static FastInvokeHandler GetMethodInvoker(MethodInfo methodInfo)
{
    DynamicMethod dynamicMethod = new DynamicMethod(string.Empty, 
                     typeof(object), new Type[] { typeof(object), 
                     typeof(object[]) }, 
                     methodInfo.DeclaringType.Module);
    ILGenerator il = dynamicMethod.GetILGenerator();
    ParameterInfo[] ps = methodInfo.GetParameters();
    Type[] paramTypes = new Type[ps.Length];
    for (int i = 0; i < paramTypes.Length; i++)
    {
        paramTypes[i] = ps[i].ParameterType;
    }
    LocalBuilder[] locals = new LocalBuilder[paramTypes.Length];
    for (int i = 0; i < paramTypes.Length; i++)
    {
        locals[i] = il.DeclareLocal(paramTypes[i]);
    }
    for (int i = 0; i < paramTypes.Length; i++)
    {
        il.Emit(OpCodes.Ldarg_1);
        EmitFastInt(il, i);
        il.Emit(OpCodes.Ldelem_Ref);
        EmitCastToReference(il, paramTypes[i]);
        il.Emit(OpCodes.Stloc, locals[i]);
    }
    il.Emit(OpCodes.Ldarg_0);
    for (int i = 0; i < paramTypes.Length; i++)
    {
        il.Emit(OpCodes.Ldloc, locals[i]);
    }
    il.EmitCall(OpCodes.Call, methodInfo, null);
    if (methodInfo.ReturnType == typeof(void))
        il.Emit(OpCodes.Ldnull);
    else
        EmitBoxIfNeeded(il, methodInfo.ReturnType);
    il.Emit(OpCodes.Ret);
    FastInvokeHandler invoder = 
      (FastInvokeHandler)dynamicMethod.CreateDelegate(
      typeof(FastInvokeHandler));
    return invoder;
}
 

Conclusion

Well, I think this is a general way that can be used instead of most of the reflection methods to get about 50 times performance improvement. Any suggestions for improvements are welcome.

Extra advantage (reminded by MaxGuernsey): If an exception occurs in your code, FastInovker would throw the original one, but the Method.Invoke would throw a TargetInvocationException .

 

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Click here
Luyan



China China

Member
I am currently working for a .NET framework names AgileFramework. It's introduction at here:
http://www.agilelabs.cn/agileframework

Now I'm living in China. I have been designing and developing .NET based software applications for 5+ years.
分享到:
评论

相关推荐

    FastMethodInvoker.rar

    在.NET框架中,方法的调用方式有很多种,其中包括传统的反射(Reflection)、委托(Delegates)以及本文重点讨论的“快速方法调用”(FastMethodInvoker)。`FastMethodInvoker`是一种优化过的反射调用方式,旨在...

    使用httpInvoker提供远程服务

    首先,我们需要一个实现远程服务接口的业务对象,例如`HelloImpl`,它返回一个实现了`Serializable`接口的`Person`对象。这样,当对象通过网络传输时,Java的序列化机制能够正确处理它们: ```java public class ...

    http invoker 做post测试

    HTTP Invoker 是一个Java框架,主要用于在分布式系统中进行远程方法调用(RPC)。它通过HTTP协议提供服务,使得客户端可以像调用本地方法一样调用远程服务。在这个场景下,“http invoker 做post测试”指的是在完成...

    Spring HttpInvoker介绍

    公司内部讲义,比较了SOA,RMI和Spring HttpInvoker。并介绍了Spring HttpInvoker的基本使用方法。

    springboot-httpinvoker-demo.zip

    而在微服务架构中,服务间通信是必不可少的一部分,HTTP Invoker作为Spring框架的一个组件,为Spring Boot应用提供了一种轻量级的远程方法调用(RMI)方案。本篇将深入探讨SpringBoot HTTP Invoker的原理、配置以及...

    HttpInvoker.zip http调试工具

    《HttpInvoker:深入理解HTTP调试工具的奥秘》 ...HttpInvoker是一款专门针对HTTP调试设计的工具,它提供了比浏览器...在日常工作中,不妨尝试利用HttpInvoker来提升你的工作效率,让每一个HTTP请求都变得透明且可控。

    Spring HttpInvoker的封装

    而是创建一个`HttpInvokerProxyFactoryBean`,指定服务端URL和服务接口,这样就可以像调用本地方法一样调用远程服务。 ```xml &lt;bean id="myServiceProxy" class="org.springframework.remoting.httpinvoker....

    Hessian 、 HttpInvoker 、 XFire 、 Axis

    通过定义一个`RemoteServicePool`接口,我们可以将具体的远程调用技术(如Hessian、HttpInvoker、XFire)的细节隐藏起来,开发者只需要通过接口方法`getService(String serviceId)`来获取服务,而无需关心服务的实现...

    Http Invoker

    1. **Postman**:一个强大的API开发和测试工具,支持自动化测试套件,具有丰富的功能和友好的界面。 2. **JMeter**:Apache JMeter是一款开源的性能测试工具,不仅可以做接口测试,还能进行压力测试,适合大型项目...

    Jmail+ HttpInvoker+定时任务+Aop+Rmi+

    RMI允许一个Java对象调用另一个位于不同JVM中的对象的方法,实现了分布式计算。RMI的核心概念包括远程接口、远程对象和 stub/skeleton,开发者需要定义远程接口,实现远程对象,并通过RMI注册表暴露服务。RMI适合于...

    用Http Invoker实现RCP客户端与后台的交互

    在IT行业中,远程过程调用(Remote Procedure Call, RPC)是一种常见的通信机制,它允许一个程序调用另一个在不同地址空间(通常是网络另一端)的程序。`Http Invoker`是Spring框架提供的一种基于HTTP协议的RPC实现...

    httpinvoker.zip

    HTTP Invoker 是一个用于网络请求测试的工具,尤其适合APP、小程序以及API开发人员进行功能验证和性能测试。它简化了HTTP请求的构建和发送过程,使得开发者可以更便捷地模拟客户端行为,对服务器端接口进行调试和...

    Spring的HttpInvoker使用示例 (可下载源码)

    NULL 博文链接:https://lggege.iteye.com/blog/369151

    Spring HttpInvoker

    Spring HttpInvoker,是一套基于Maven+Spring+SpringMVC+MyBatis框架,还包含了Invoker的客户端及服务器端的demo实例

    spring httpInvoker示例

    在`sayHello`方法中,我们传递了一个字符串参数并返回一个字符串。而在`processData`方法中,我们传递了一个自定义的`CustomObject`实例,并接收处理后的`CustomObject`作为返回值。 总结来说,Spring HTTP Invoker...

    HttpInvoker Sample

    这个"HttpInvoker Sample"是一个示例项目,旨在帮助用户理解和掌握如何在实践中使用HttpInvoker。 首先,我们来详细讲解一下HttpInvoker的工作原理。HttpInvoker的核心在于`HttpInvokerRequestExecutor`,它负责将...

    spring-httpinvoker-demo

    Spring HTTP Invoker是spring框架中的一个远程调用模型,执行基于HTTP的远程调用,也就是说,可以通过防火墙,并使用java的序列化机制在网络间传递对象。客户端可以很轻松的像调用本地对象一样调用远程服务器上的...

    Eclipse工程Http Invoker Service & Client

    Http Invoker是Spring框架的一个组件,允许在分布式环境中通过HTTP协议透明地调用Java对象的方法,提供了一种轻量级的RPC(Remote Procedure Call)实现。 **Http Invoker服务端(Service)** 在Http Invoker...

    HttpInvoker

    模拟提交GET/POST,鞥呢返回详细头,cookies

    C++实现反射机制

    对于方法的动态调用,可以创建一个`Invoker`类,使用虚函数或函数指针来表示不同的方法调用。对于字段访问,可以设计一个`Accessor`类,存储字段的获取和设置操作。 ```cpp struct Invoker { virtual ~Invoker() {...

Global site tag (gtag.js) - Google Analytics