来看Java中经由过程Emit完成静态类天生
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;
}
//失掉范例天生器
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;
for(inti=0;i<paramInfo.Length;i++)
paramType=paramInfo.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的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? Java是一种计算机编程语言,拥有跨平台、面向对java J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
页:
[1]