介绍
小编给大家分享一下Java中用表达式数调用的实例代码,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!
利用表达式树构建委托改善反射性能做了一点小更改正好适合自己用
DynamicMethodBuilder公共静态类 {公共静态委托BuildDynamicDelegate (MethodInfo MethodInfo, ConstructorInfo ConstructorInfo=null) {如果(methodInfo==null)把新ArgumentNullException (“methodInfo"); ListparamExpressions=methodInfo.GetParameters ()。选择((p, i)=祝辞{var name=皃aram"+ (i + 1);返回Expression.Parameter (p。ParameterType、名称); }).ToList (); MethodCallExpression callExpression;如果(methodInfo.IsStatic) {//电话(params ....) callExpression=表达式。调用(methodInfo paramExpressions); 其他}{如果(constructorInfo !=null) {//实例(params)打电话给(params ....) List constructorParamExpressions=constructorInfo.GetParameters ()。选择((p, i)=祝辞{var name=癱onstparam"+ (i + 1);返回Expression.Parameter (p。ParameterType、名称); }).ToList (); callExpression=Expression.Call(表达式。新(constructorInfo constructorParamExpressions)、methodInfo paramExpressions); paramExpressions。InsertRange (0, constructorParamExpressions); 其他}{ callExpression=Expression.Call (Expression.New (methodInfo.ReflectedType) methodInfo, paramExpressions); } }表达式返回。λ(callExpression paramExpressions) .Compile (); } }
测试:
公共类的婴儿 { 私人只读的DateTime _birthDay; 公共婴儿(DateTime生日) { _birthDay=生日; } 公共的婴儿() { _birthDay=DateTime.Now; } 公共GetBabyInfo字符串(字符串名称,int性)=比;“美元姓名:{名称},出生天数:{DateTime。现在- _birthDay},性别:{(性==1 ?“男”;:“女“)}“;; } 类项目 { 静态void Main (string [] args) { 类型targetType=Assembly.GetExecutingAssembly () . gettype (“ConsoleApplication1.Baby"); MethodInfo MethodInfo=targetType.GetMethod (“GetBabyInfo",新的[]{typeof(字符串),typeof (int)});=targetType ConstructorInfo构造函数。GetConstructor(新[]{typeof (DateTime)}); WithConstructor (methodInfo,构造函数); WithOutConstructor (methodInfo); 控制台.阅读键(): } 静态孔隙WithConstructor (MethodInfo MethodInfo ConstructorInfo构造函数) { var func=(Func) DynamicMethodBuilder。BuildDynamicDelegate (methodInfo,构造函数); Console.WriteLine (func (DateTime.Now.AddDays(-100),“糖墩儿“,1)); } 静态孔隙WithOutConstructor (MethodInfo MethodInfo) { var func=(Func<字符串,int, string>) DynamicMethodBuilder.BuildDynamicDelegate (methodInfo); Console.WriteLine (func(“糖墩儿“,1)); } }
看完了这篇文章,相信你对Java中用表达式数调用的实例代码有了一定的了解,想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!