Õ¾ÄÚËÑË÷: ÇëÊäÈëËÑË÷¹Ø¼ü´Ê

µ±Ç°Ò³Ãæ: ¿ª·¢×ÊÁÏÊ×Ò³ ¡ú 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×÷Ò»¸öÈÕÀú¿ØÖƳÌÐò