快速业务通道

Java中通过Emit实现动态类生成 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
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

好了,测试一下试试看:

using System; public class Tester {  public static void Main(String[] args)  {   TypeCreator tc=new TypeCreator(typeof(IAnimal));   Type t = tc.build();   IAnimal animal= (IAnimal)Activator.CreateInstance(t);   animal.move();   animal.eat();   Console.Read ();  } }

得到输出:I''m moveingI''m eating。

总结

如果用于AOP的话,Emit可以动态生成一个装饰类,相比于基于Remoting架构的TP/RP的方法,效率可能要高些,而且还能拦截new操作符。缺点:对于非Virtual的方法,似乎无法拦截。用于O/R Mapping的类生成,倒是不错。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号