普通反射方法
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
Luyan
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.
|
分享到:
相关推荐
在.NET框架中,方法的调用方式有很多种,其中包括传统的反射(Reflection)、委托(Delegates)以及本文重点讨论的“快速方法调用”(FastMethodInvoker)。`FastMethodInvoker`是一种优化过的反射调用方式,旨在...
首先,我们需要一个实现远程服务接口的业务对象,例如`HelloImpl`,它返回一个实现了`Serializable`接口的`Person`对象。这样,当对象通过网络传输时,Java的序列化机制能够正确处理它们: ```java public class ...
HTTP Invoker 是一个Java框架,主要用于在分布式系统中进行远程方法调用(RPC)。它通过HTTP协议提供服务,使得客户端可以像调用本地方法一样调用远程服务。在这个场景下,“http invoker 做post测试”指的是在完成...
公司内部讲义,比较了SOA,RMI和Spring HttpInvoker。并介绍了Spring HttpInvoker的基本使用方法。
而在微服务架构中,服务间通信是必不可少的一部分,HTTP Invoker作为Spring框架的一个组件,为Spring Boot应用提供了一种轻量级的远程方法调用(RMI)方案。本篇将深入探讨SpringBoot HTTP Invoker的原理、配置以及...
《HttpInvoker:深入理解HTTP调试工具的奥秘》 ...HttpInvoker是一款专门针对HTTP调试设计的工具,它提供了比浏览器...在日常工作中,不妨尝试利用HttpInvoker来提升你的工作效率,让每一个HTTP请求都变得透明且可控。
而是创建一个`HttpInvokerProxyFactoryBean`,指定服务端URL和服务接口,这样就可以像调用本地方法一样调用远程服务。 ```xml <bean id="myServiceProxy" class="org.springframework.remoting.httpinvoker....
通过定义一个`RemoteServicePool`接口,我们可以将具体的远程调用技术(如Hessian、HttpInvoker、XFire)的细节隐藏起来,开发者只需要通过接口方法`getService(String serviceId)`来获取服务,而无需关心服务的实现...
1. **Postman**:一个强大的API开发和测试工具,支持自动化测试套件,具有丰富的功能和友好的界面。 2. **JMeter**:Apache JMeter是一款开源的性能测试工具,不仅可以做接口测试,还能进行压力测试,适合大型项目...
RMI允许一个Java对象调用另一个位于不同JVM中的对象的方法,实现了分布式计算。RMI的核心概念包括远程接口、远程对象和 stub/skeleton,开发者需要定义远程接口,实现远程对象,并通过RMI注册表暴露服务。RMI适合于...
在IT行业中,远程过程调用(Remote Procedure Call, RPC)是一种常见的通信机制,它允许一个程序调用另一个在不同地址空间(通常是网络另一端)的程序。`Http Invoker`是Spring框架提供的一种基于HTTP协议的RPC实现...
HTTP Invoker 是一个用于网络请求测试的工具,尤其适合APP、小程序以及API开发人员进行功能验证和性能测试。它简化了HTTP请求的构建和发送过程,使得开发者可以更便捷地模拟客户端行为,对服务器端接口进行调试和...
NULL 博文链接:https://lggege.iteye.com/blog/369151
Spring HttpInvoker,是一套基于Maven+Spring+SpringMVC+MyBatis框架,还包含了Invoker的客户端及服务器端的demo实例
在`sayHello`方法中,我们传递了一个字符串参数并返回一个字符串。而在`processData`方法中,我们传递了一个自定义的`CustomObject`实例,并接收处理后的`CustomObject`作为返回值。 总结来说,Spring HTTP Invoker...
这个"HttpInvoker Sample"是一个示例项目,旨在帮助用户理解和掌握如何在实践中使用HttpInvoker。 首先,我们来详细讲解一下HttpInvoker的工作原理。HttpInvoker的核心在于`HttpInvokerRequestExecutor`,它负责将...
Spring HTTP Invoker是spring框架中的一个远程调用模型,执行基于HTTP的远程调用,也就是说,可以通过防火墙,并使用java的序列化机制在网络间传递对象。客户端可以很轻松的像调用本地对象一样调用远程服务器上的...
Http Invoker是Spring框架的一个组件,允许在分布式环境中通过HTTP协议透明地调用Java对象的方法,提供了一种轻量级的RPC(Remote Procedure Call)实现。 **Http Invoker服务端(Service)** 在Http Invoker...
模拟提交GET/POST,鞥呢返回详细头,cookies
对于方法的动态调用,可以创建一个`Invoker`类,使用虚函数或函数指针来表示不同的方法调用。对于字段访问,可以设计一个`Accessor`类,存储字段的获取和设置操作。 ```cpp struct Invoker { virtual ~Invoker() {...