仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 545|回复: 12
打印 上一主题 下一主题

[学习教程] 来看Java中经由过程Emit完成静态类天生

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:30:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大.
静态天生一个类关于AOP,O/RMapping等手艺十分有匡助。关于Java来讲,成绩不年夜,而关于.NET,则要贫苦些(次要贫苦在于完成代码的天生必要IL),故推测这大概也是在AOP,O/RMapping方面,Java走得略前的缘故原由吧。
贫苦回贫苦,非不克不及也,静态天生一个复杂的类还不至于太难。
假定有以下接口:
interfaceIAnimal
{
 voidmove();
 voideat();
}
但愿能创立一个类天生器TypeCreator,并能以以下体例利用:
TypeCreatortc=newTypeCreator(typeof(IAnimal));
Typet=tc.build();
IAnimalmyAnimal=(IAnimal)Activator.CreateInstance(t);
myAnimal.move();
myAnimal.eat();
起首,发明System.Reflection.Emit.TypeBuilder仿佛就是一个现成的类天生器。不外TypeBuilder既没有有用的static办法,也不克不及在内部实例化。不外ModuleBuilder倒有一个DefineType()办法,能够失掉TypeBuilder;而ModuleBuilder和TyperBuilder一个品德,不克不及间接创立,得从AssemblyBuilder的DefineDynamicModule()办法失掉。追根溯源,AssemblyBuilder得从AppDomain的DefineDynamicAssembly()的得来。终极幸亏AppDomain供应了一个静态办法:AppDomain.CurrentDomain.这连续串并不是没有事理,范例是依靠于Module的,而Module依靠于Assembly,而Assembly则被AppDomain装载。所谓“皮之不存,毛将焉附”,为了创立Type这个“毛”,得先把Assembly,Module这些“皮”顺次机关出来:
usingSystem;
usingSystem.Reflection;
usingSystem.Reflection.Emit;
publicclassTypeCreator
{
 privateTypetargetType;
 ///<summary>
 ///机关函数
 ///</summary>
 ///<paramname="targetType">被完成大概承继的范例</param>
 publicTypeCreator(TypetargetType)
 {
  this.targetType=targetType;
 }
 publicTypebuild()
 {
  //猎取以后AppDomain
  AppDomaincurrentAppDomain=AppDomain.CurrentDomain;
  //System.Reflection.AssemblyName是用来暗示一个Assembly的完全称号的
  AssemblyNameassyName=newAssemblyName();
  //为要创立的Assembly界说一个称号(这里疏忽版本号,Culture等信息)
  assyName.Name="MyAssyFor_"+targetType.Name;
  //猎取AssemblyBuilder
  //AssemblyBuilderAccess有Run,Save,RunAndSave三个取值
  AssemblyBuilderassyBuilder=currentAppDomain.DefineDynamicAssembly(assyName,AssemblyBuilderAccess.Run);
  //猎取ModuleBuilder,供应String参数作为Module称号,任意设一个
  ModuleBuildermodBuilder=assyBuilder.DefineDynamicModule("MyModFor_"+targetType.Name);
  //新范例的称号:任意定一个
  StringnewTypeName="Imp_"+targetType.Name;
  //新范例的属性:要创立的是Class,而非Interface,AbstractClass等,并且是Public的
  TypeAttributesnewTypeAttribute=TypeAttributes.Class|TypeAttributes.Public;
  //声明要创立的新范例的父范例
  TypenewTypeParent;
  //声明要创立的新范例要完成的接口
  Type[]newTypeInterfaces;
  //关于基范例是不是为接口,作分歧处置
  if(targetType.IsInterface)
  {
   newTypeParent=null;
   newTypeInterfaces=newType[]{targetType};
  }
  else
  {
   newTypeParent=targetType;
   newTypeInterfaces=newType[0];
  }
  //失掉范例天生器
  TypeBuildertypeBuilder= modBuilder.DefineType(newTypeName,newTypeAttribute,newTypeParent,newTypeInterfaces);
  //以下将为新范例声明办法:新范例应当override基范例的以是virtual办法
  //失掉基范例的一切办法
  MethodInfo[]targetMethods=targetType.GetMethods();
  //遍历各个办法,关于Virtual的办法,猎取其署名,作为新范例的办法
  foreach(MethodInfotargetMethodintargetMethods)
  {
   //只挑出virtual的办法
   if(targetMethod.IsVirtual)
   {
    //失掉办法的各个参数的范例
    ParameterInfo[]paramInfo=targetMethod.GetParameters();
    Type[]paramType=newType[paramInfo.Length];
    for(inti=0;i<paramInfo.Length;i++)
     paramType[i]=paramInfo[i].ParameterType;
     //传进办法署名,失掉办法天生器
     MethodBuildermethodBuilder=typeBuilder.DefineMethod(targetMethod.Name,MethodAttributes.Public|
       MethodAttributes.Virtual,targetMethod.ReturnType,paramType);
     //因为要天生的是详细类,以是办法的完成是必不成少的。而办法的完成是经由过程EmitIL代码来发生的

     //失掉IL天生器
     ILGeneratorilGen=methodBuilder.GetILGenerator();
     //以下三行相称于:{Console.Writeln("Im"+targetMethod.Name+"ing");}
     ilGen.Emit(OpCodes.Ldstr,"Im"+targetMethod.Name+"ing");
     ilGen.Emit(OpCodes.Call,typeof(Console).GetMethod("WriteLine",newType[]{typeof(String)}));
     ilGen.Emit(OpCodes.Ret);
   }
  }
  //真正创立,并前往
  return(typeBuilder.CreateType());
 }
}
<p>
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-20 20:18:27 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
再见西城 该用户已被删除
板凳
发表于 2015-1-23 12:11:31 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
柔情似水 该用户已被删除
地板
发表于 2015-1-25 18:13:25 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
飘飘悠悠 该用户已被删除
5#
发表于 2015-1-29 06:12:16 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
谁可相欹 该用户已被删除
6#
发表于 2015-2-2 18:12:45 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
山那边是海 该用户已被删除
7#
发表于 2015-2-8 04:03:36 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
第二个灵魂 该用户已被删除
8#
发表于 2015-2-26 05:03:58 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
小妖女 该用户已被删除
9#
发表于 2015-3-8 12:08:19 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
精灵巫婆 该用户已被删除
10#
发表于 2015-3-10 07:26:32 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
admin 该用户已被删除
11#
发表于 2015-3-11 08:02:35 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
爱飞 该用户已被删除
12#
发表于 2015-3-17 23:38:42 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
冷月葬花魂 该用户已被删除
13#
发表于 2015-3-25 07:32:14 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 01:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表