Java中通过Emit实现动态类生成 - 编程入门网
typeBuilder = modBuilder.DefineType(newTypeName,newTypeAttribute,newTypeParent,newTypeInterfaces);
//以下将为新类型声明方法:新类型应该override基类型的所以virtual方法
//得到基类型的所有方法
MethodInfo[] targetMethods = targetType.GetMethods();
//遍历各个方法,对于Virtual的方法,获取其签名,作为新类型的方法
foreach(MethodInfo targetMethod in targetMethods)
{
//只挑出virtual的方法
if(targetMethod.IsVirtual)
{
//得到方法的各个参数的类型
ParameterInfo[] paramInfo = targetMethod.GetParameters();
Type[] paramType = new Type[paramInfo.Length];
for(int i=0;i<paramInfo.Length;i++)
paramType[i] = paramInfo[i].ParameterType;
//传入方法签名,得到方法生成器
MethodBuilder methodBuilder = typeBuilder.DefineMethod(targetMethod.Name,MethodAttributes.Public|
MethodAttributes.Virtual,targetMethod.ReturnType,paramType);
//由于要生成的是具体类,所以方法的实现是必不可少的。而方法的实现是通过Emit IL代码来产生的
//得到IL生成器
ILGenerator ilGen = methodBuilder.GetILGenerator();
//以下三行相当于:{Console.Writeln("I''m "+ targetMethod.Name +"ing");}
ilGen.Emit(OpCodes.Ldstr,"I''m "+ targetMethod.Name +"ing");
ilGen.Emit(OpCodes.Call,typeof(Console).GetMethod("WriteLine",new Type[]{typeof(String)}));
ilGen.Emit(OpCodes.Ret);
}
}
//真正创建,并返回
return(typeBuilder.CreateType());
}
}
Java中通过Emit实现动态类生成(2)时间:2010-04-27好了,测试一下试试看:
得到输出:I''m moveingI''m eating。 总结 如果用于AOP的话,Emit可以动态生成一个装饰类,相比于基于Remoting架构的TP/RP的方法,效率可能要高些,而且还能拦截new操作符。缺点:对于非Virtual的方法,似乎无法拦截。用于O/R Mapping的类生成,倒是不错。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |