µ±Ç°Ò³Ãæ: ¿ª·¢×ÊÁÏÊ×Ò³ ¡ú Java רÌâ ¡ú JavaÖÐͨ¹ýEmitʵÏÖ¶¯Ì¬ÀàÉú³É
JavaÖÐͨ¹ýEmitʵÏÖ¶¯Ì¬ÀàÉú³É
ÕªÒª: ¶¯Ì¬Éú³ÉÒ»¸öÀà¶ÔÓÚAOP£¬O/R MappingµÈ¼¼Êõ·Ç³£ÓаïÖú
¡¡¡¡¶¯Ì¬Éú³ÉÒ»¸öÀà¶ÔÓÚAOP£¬O/R MappingµÈ¼¼Êõ·Ç³£ÓаïÖú¡£¶ÔÓÚJavaÀ´Ëµ£¬ÎÊÌâ²»´ó£¬¶ø¶ÔÓÚ.NET£¬ÔòÒªÂ鷳Щ£¨Ö÷ÒªÂé·³ÔÚÓÚʵÏÖ´úÂëµÄÉú³ÉÐèÒªIL£©£¬¹Ê²Â²âÕâ¿ÉÄÜÒ²ÊÇÔÚAOP, O/R Mapping·½Ã棬Java×ßµÃÂÔǰµÄÔÒò°É¡£
¡¡¡¡Âé·³¹éÂé·³£¬·Ç²»ÄÜÒ²£¬¶¯Ì¬Éú³ÉÒ»¸ö¼òµ¥µÄÀ໹²»ÖÁÓÚÌ«ÄÑ¡£
¡¡¡¡¼ÙÉèÓÐÈçϽӿڣº
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<tr>
<td>interface IAnimal
{
¡¡void move();
¡¡void eat();
} </td></tr></table>
¡¡¡¡Ï£ÍûÄÜ´´½¨Ò»¸öÀàÉú³ÉÆ÷TypeCreator£¬²¢ÄÜÒÔÒÔÏ·½Ê½Ê¹ÓÃ:
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<tr>
<td>TypeCreator tc=new TypeCreator(typeof(IAnimal));
Type t = tc.build();
IAnimal myAnimal= (IAnimal)Activator.CreateInstance(t);
myAnimal.move();
myAnimal.eat();</td></tr></table>
¡¡¡¡Ê×ÏÈ£¬·¢ÏÖ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ÕâЩ¡°Æ¤¡±ÒÀ´Î¹¹Ôì³öÀ´£º
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<tr>
<td>using System;
using System.Reflection;
using System.Reflection.Emit;
public class TypeCreator
{
¡¡private Type targetType;
¡¡///
¡¡/// ¹¹Ô캯Êý
¡¡///
¡¡/// ±»ÊµÏÖ»òÕ߼̳еÄÀàÐÍ
¡¡public TypeCreator(Type targetType)
¡¡{
¡¡¡¡this.targetType = targetType;
¡¡}
¡¡public Type build()
¡¡{
¡¡¡¡//»ñÈ¡µ±Ç°AppDomain
¡¡¡¡AppDomain currentAppDomain = AppDomain.CurrentDomain;
¡¡¡¡//System.Reflection.AssemblyName ÊÇÓÃÀ´±íʾһ¸öAssemblyµÄÍêÕûÃû³ÆµÄ
¡¡¡¡AssemblyName assyName = new AssemblyName();
¡¡¡¡//ΪҪ´´½¨µÄAssembly¶¨ÒåÒ»¸öÃû³Æ£¨ÕâÀïºöÂÔ°æ±¾ºÅ£¬CultureµÈÐÅÏ¢£©
¡¡¡¡assyName.Name = "MyAssyFor_" + targetType.Name;
¡¡¡¡//»ñÈ¡AssemblyBuilder
¡¡¡¡//AssemblyBuilderAccessÓÐRun£¬Save£¬RunAndSaveÈý¸öȡֵ
¡¡¡¡AssemblyBuilder assyBuilder = currentAppDomain.DefineDynamicAssembly(assyName,AssemblyBuilderAccess.Run);
¡¡¡¡//»ñÈ¡ModuleBuilder£¬ÌṩString²ÎÊý×÷ΪModuleÃû³Æ£¬Ëæ±ãÉèÒ»¸ö
¡¡¡¡ModuleBuilder modBuilder = assyBuilder.DefineDynamicModule("MyModFor_"+targetType.Name);
¡¡¡¡//ÐÂÀàÐ͵ÄÃû³Æ£ºËæ±ã¶¨Ò»¸ö
¡¡¡¡String newTypeName = "Imp_"+targetType.Name;
¡¡¡¡//ÐÂÀàÐ͵ÄÊôÐÔ£ºÒª´´½¨µÄÊÇClass£¬¶ø·ÇInterface£¬Abstract ClassµÈ£¬¶øÇÒÊÇPublicµÄ
¡¡¡¡TypeAttributes newTypeAttribute = TypeAttributes.Class | TypeAttributes.Public;
¡¡¡¡//ÉùÃ÷Òª´´½¨µÄÐÂÀàÐ͵ĸ¸ÀàÐÍ
¡¡¡¡Type newTypeParent;
¡¡¡¡//ÉùÃ÷Òª´´½¨µÄÐÂÀàÐÍҪʵÏֵĽӿÚ
¡¡¡¡Type[] newTypeInterfaces;
¡¡¡¡//¶ÔÓÚ»ùÀàÐÍÊÇ·ñΪ½Ó¿Ú£¬×÷²»Í¬´¦Àí
¡¡¡¡if(targetType.IsInterface)
¡¡¡¡{
¡¡¡¡¡¡newTypeParent = null;
¡¡¡¡¡¡newTypeInterfaces = new Type[]{targetType};
¡¡¡¡}
¡¡¡¡else
¡¡¡¡{
¡¡¡¡¡¡newTypeParent = targetType;
¡¡¡¡¡¡newTypeInterfaces = new Type[0];
¡¡¡¡}
¡¡¡¡//µÃµ½ÀàÐÍÉú³ÉÆ÷
¡¡¡¡TypeBuilder 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¡¡¡¡¡¡¡¡¡¡paramType[i] = paramInfo[i].ParameterType;
¡¡¡¡¡¡¡¡¡¡//´«Èë·½·¨Ç©Ãû£¬µÃµ½·½·¨Éú³ÉÆ÷
¡¡¡¡¡¡¡¡¡¡MethodBuilder methodBuilder = typeBuilder.DefineMethod(targetMethod.Name,MethodAttributes.Public|
¡¡¡¡¡¡¡¡¡¡¡¡¡¡MethodAttributes.Virtual,targetMethod.ReturnType,paramType);
¡¡¡¡¡¡¡¡¡¡//ÓÉÓÚÒªÉú³ÉµÄÊǾßÌåÀ࣬ËùÒÔ·½·¨µÄʵÏÖÊDZز»¿ÉÉٵġ£¶ø·½·¨µÄʵÏÖÊÇͨ¹ý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());
¡¡}
} </td></tr></table>
¡¡¡¡ºÃÁË£¬²âÊÔÒ»ÏÂÊÔÊÔ¿´£º
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<tr>
<td>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 ();
¡¡}
} </td></tr></table>
¡¡¡¡µÃµ½Êä³ö£ºI'm moveingI'm eating¡£
¡¡¡¡
×ܽᡡ¡¡Èç¹ûÓÃÓÚAOPµÄ»°£¬Emit¿ÉÒÔ¶¯Ì¬Éú³ÉÒ»¸ö×°ÊÎÀ࣬Ïà±ÈÓÚ»ùÓÚRemoting¼Ü¹¹µÄTP/RPµÄ·½·¨£¬Ð§ÂÊ¿ÉÄÜÒª¸ßЩ£¬¶øÇÒ»¹ÄÜÀ¹½Ønew²Ù×÷·û¡£È±µã£º¶ÔÓÚ·ÇVirtualµÄ·½·¨£¬ËƺõÎÞ·¨À¹½Ø¡£ÓÃÓÚO/R MappingµÄÀàÉú³É£¬µ¹ÊDz»´í¡£
¡ü·µ»ØÄ¿Â¼
ǰһƪ:
JavaÖÐʵÏÖ»ùÓÚAspectwerkzµÄAOP¿ª·¢
ºóһƪ:
ÓÃJava Swing×÷Ò»¸öÈÕÀú¿ØÖƳÌÐò