Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
¹¹½¨Java Agent£¬¶ø²»ÊÇʹÓÿò¼Ü
 
×÷ÕߣºØýÃû À´Ô´£ºImportNew »ðÁú¹ûÈí¼þ ·¢²¼ÓÚ 2015-4-24
  2334  次浏览      27
 

Java annotations×Ô´Ó±»ÒýÈëµ½JavaÖ®ºó£¬Ò»Ö±°çÑÝ×ÅÕûºÏ¸÷ÖÖAPIµÄ×÷Óã¬ÓÈÆäÊǶԴóÐÍÓ¦Óÿò¼Ü¶øÑÔ¡£ÔÚÕâ·½Ãæ£¬SpringºÍHibernate¶¼ÊÇJava annotationÓ¦ÓõĺÃÀý×Ó¡ª¡ª½ö½öÐèÒªÔö¼Ó¼¸Ðмòµ¥µÄJava annotation´úÂ룬¾Í¿ÉÒÔʵÏַdz£¸´ÔӵijÌÐòÂß¼­¡£¾¡¹Ü¶ÔÕâЩAPI£¨µÄд·¨£©´æÔÚһЩÕùÂÛ£¬µ«ÊÇ´ó¶àÊý³ÌÐòÔ±ÈÏΪ£¬Ö»ÒªÊ¹Óõõ±£¬ÕâÖÖÉùÃ÷ʽ±à³ÌÔÚÐÎʽÉÏ»¹ÊǺÜÓбí´ïÄÜÁ¦µÄ¡£²»¹ý£¬Ö»ÓÐÉÙÁ¿³ÌÐòÔ±»ùÓÚJava annotationÀ´±àд¿ò¼ÜAPI£¬»òÕßÓ¦ÓóÌÐòÖмä¼þ¡£Ö®ËùÒÔÔì³ÉÕâÖÖÏÖÏóºÜÖ÷ÒªµÄÒ»¸öÔ­ÒòÊÇ£¬³ÌÐòÔ±ÃÇÈÏΪJava annotation»á½µµÍ´úÂëµÄ¿É¶ÁÐÔ¡£ÔÚ±¾ÎÄÖУ¬ÎÒ¾ÍÏë¸æËß´ó¼Ò£¬ÊµÏÖÕâЩ»ùÓÚannotationµÄAPIÆäʵ²¢²»ÊÇÍêÈ«ÎÞÓõģ¬Ö»ÒªÊ¹ÓÃÇ¡µ±µÄ¹¤¾ß£¬ÆäʵÄãÒ²²¢²»ÐèÒªÁ˽âÌ«¶àJavaÄÚ²¿º¯ÊýµÄ֪ʶ¡£

ÔÚ ÊµÏÖ»ùÓÚannotationµÄAPIʱ£¬ºÜÃ÷ÏÔµÄÒ»¸öÎÊÌâ¾ÍÊÇ£ºÕâЩAPIÔÚJavaÔËÐÐʱÊDz»»á±»JVM´¦ÀíµÄ¡£ÕâÑùÔì³ÉµÄ½á¹û¾ÍÊÇ£¬Äãû·¨¸øÒ»¸öÓà »§annotation¸³ÓèÒ»¸ö¾ßÌåµÄº¬Òå¡£ÀýÈ磺Èç¹ûÎÒÃǶ¨ÒåÁËÒ»¸ö@Log annotation£¬È»ºóÎÒÃÇÆÚÍûÔÚ±ê×¢ÁË@LogµÄµØ·½£¬Ã¿µ÷ÓÃÒ»´Î¾ÍÐγÉÒ»ÌõÈÕÖ¾¼Ç¼¡£

class Service {
@Log
void doSomething() {
// do something ...
}
}

µ¥¿¿@Log ±ê×¢±¾ÉíдÔÚÄÄÀÊDz»¿ÉÄÜÍê³ÉÖ´ÐгÌÐòÂß¼­µÄÈÎÎñµÄ£¬Õâ¾ÍÐèÒª±ê×¢µÄʹÓÃÕßÈ¥·¢ÆðÉú³ÉÈÕÖ¾µÄÈÎÎñ¡£Ã÷ÏÔ£¬ÕâÖÖ¹¤×÷Ô­ÀíÈÃannotation¿´ÉÏÈ¥ºÁÎÞ ÒâÒ壬ÒòΪÔÙµ÷ÓÃdoSomething·½·¨µÄʱºò£¬ÎÒÃǸù±¾ÎÞ·¨È¥¹Û²ìÉú³ÉµÄlogÀïÃæÏàÓ¦µÄ״̬¡£Òò´Ë£¬annotation½ö½öÊÇ×÷Ϊһ¸ö±ê¼Ç¶ø´æ ÔÚ£¬¶Ô³ÌÐòÂß¼­À´ËµºÁÎÞ¹±Ï׿ÉÑÔ¡£

Ìî¿Ó

ΪÁ˿˷þÉÏÊöµÄ¹¦ÄÜÐÔ¾ÖÏÞ£¬ºÜ¶à»ùÓÚ±ê×¢µÄ¿ò¼Ü¶¼²ÉÓÃÁË×ÓÀา¸ÇÀà·½·¨µÄģʽ£¬À´¸³ÓèÌØ¶¨±ê×¢Ïà¹ØµÄ³ÌÐòÂß¼­¹¦ÄÜ¡£ÕâÖÖ·½·¨ÆÕ±éʹÓÃÁËÃæÏò¶ÔÏóµÄ¼¯³É»úÖÆ¡£¶ÔÓÚÎÒÃÇÉÏÃæÌáµ½µÄ@Log±ê×¢À´Ëµ£¬×ÓÀàʵÏÖ»úÖÆ»á²úÉúÒ»¸öÀàËÆÓÚÏÂÃæµÄÀàLoggingService£º

class LoggingService extends Service {
@Override
void doSomething() {
Logger.log("doSomething() was called");
super.doSomething();
}
}

µ±È»£¬ÉÏÃæ¶¨ÒåÕâЩÀàµÄ´úÂëͨ³£ÊDz»ÐèÒª³ÌÐòÔ±ÊÖдµÄ£¬¶øÊÇÔÚJavaÔËÐÐʱ£¬Í¨¹ýÖîÈç cglib»òJavassstÕâÑùµÄ¿âÀ´×Ô¶¯Éú³É¡£ÉÏÃæÌáµ½µÄÁ½¸ö¿â¶¼ÌṩÁ˼òÒ×µÄAPI£¬¿ÉÒÔÓÃÓÚÉú³ÉÔöÇ¿Ð͵Ä×ÓÀà³ÌÐò¡£ÕâÖÖ°ÑÀඨÒåµÄ¹ý³Ì·Åµ½ÔËÐÐʱ µÄ×ö·¨£¬Æä±È½ÏºÃµÄÒ»¸ö¸±×÷ÓÃÊÇ£¬ÔÚ²»ÌØ±ð¹æ¶¨³ÌÐò¹æ·¶£¬Ò²²»ÓÃÐÞ¸ÄÒÑÓеÄÓû§´úÂëµÄǰÌáÏ£¬Äܹ»ÓÐЧʵÏÖ logging¿ò¼ÜµÄ¹¦ÄÜ¡£ÕâÑù¾Í¿ÉÒÔ±ÜÃâ¡°ÏÔʽ´´½¨·ç¸ñ¡±£¬Ò²¾Í²»ÓÃн¨Ò»¸öJavaÔ´ÎļþÈ¥ÊÖд´úÂëÁË¡£

µ«ÊÇ£¬¿ÉÉìËõÐÔºÃÂð£¿

È»¶ø£¬ÉÏÃæµÄ½â¾ö·½°¸ÓÖ´øÀ´ÁËÁíÒ»¸ö²»×ã¡£ÎÒÃÇͨ¹ý×Ô¶¯Éú³É×ÓÀàµÄ·½Ê½ ʵÏÖ±ê×¢µÄ³ÌÐòÂß¼­£¬±ØÐë±£Ö¤ÔÚʵÀý»¯µÄʱºò²»ÄÜʹÓø¸ÀàµÄ¹¹Ô캯Êý¡£·ñÔòµ÷Óñê×¢·½·¨µÄʱºò£¬»¹ÊÇÎÞ·¨Íê³Éµ÷ÓÃÌí¼ÓÈÕÖ¾µÄ¹¦ÄÜ£ºÔ­ÒòºÜÃ÷ÏÔ£¬Óø¸ÀàµÄ¹¹ Ô캯ÊýʵÀý»¯¶ÔÏó£¬ÎÞ·¨´´½¨³ö°üº¬×ÓÀา¸Ç·½·¨µÄÕýȷʵÀý£¨ÕâÊÇ»ù±¾µÄÃæÏò¶ÔÏó¶à̬µÄ¸ÅÄ¡ªÒëÕß×¢£©¡£¸üÔã¸âµÄÊÇ¡ª¡ªµ±Ê¹ÓÃÉÏÊö·½·¨½øÐÐÔËÐÐʱ´úÂëÉú³É µÄʱºò¡ª¡ªLoggingServiceÀàÎÞ·¨Ö±½Ó±»ÊµÀý»¯£¬ÒòΪJava±àÒëÆ÷ÔÚ±àÒëµÄʱºò£¬ÔËÐÐʱÆÚ¼äÉú³ÉµÄÀà´úÂ뻹¸ù±¾¾Í²»´æÔÚ¡£

»ùÓÚÉÏÊöÔ­Òò£¬Spring»òÕßHibernateÕâЩ¿ò¼ÜʹÓÃÁË ¡°¶ÔÏ󹤳§¡±µÄģʽ¡£ÔÚÆä¿ò¼ÜÂß¼­µÄ·¶³ëÄÚ£¬²»ÔÊÐíÖ±½Ó£¨Í¨¹ý¹¹Ô캯Êý£©¶Ô¶ÔÏó½øÐÐʵÀý»¯£¬¶øÊÇͨ¹ý¹¤³§ÀàÀ´Íê³Éн¨¶ÔÏóµÄ¹¤×÷¡£ÕâÖÖ·½Ê½ÔÚSpring Éè¼ÆÖ®³õ¾Í±»²ÉÄÉ£¬ÓÃÀ´¹ÜÀí¸÷ÖÖbean¡£Hibernates²ÉÓÃÁËÏàËÆµÄ×ö·¨£¬´ó¶àÊýHibernatesµÄʵÀý±»ÊÓΪ²éѯµÄ½á¹û¶ÔÏó£¬Òò´ËÒ²²»ÊÇÏÔ Ê½µØÀ´ÊµÀý»¯µÄ¡£È»¶ø£¬ÓÐÒ»¸öÌØÀýÊÇ£¬µ±ÊÔͼ´æ´¢Ò»¸öÔÚÊý¾Ý¿âÖл¹²»´æÔڵĶÔÏóʵÀýµÄʱºò£¬HibernatesµÄʹÓÃÕßÐèÒªÓÃHibernates·µ»Ø µÄ¶ÔÏóÀ´Ì滻֮ǰ´æ´¢µÄ¶ÔÏóʵÀý¡£´ÓÕâ¸öÀý×ÓÀ´¿´HibernatesµÄÎÊÌ⣬ºöÂÔÉÏÊöµÄÌæ»»»áÔì³ÉÒ»¸öÆÕͨµÄ³õѧÕß´íÎó¡£³ý´ËÖ®Í⣬ÐÒ¿÷ÓÐÁËÕâЩ¹¤³§ À࣬²ÅÄÜÈÃ×ÓÀ໯µÄ·½·¨¶Ô¿ò¼ÜÓû§Í¸Ã÷£¬ÒòΪJavaµÄÀàÐÍϵͳ¿ÉÒÔÓÃ×ÓÀàʵÀýÀ´Ìæ´úÆä¸¸Àà¡£Òò´Ë£¬Ö»ÒªÊÇÓû§ÐèÒªµ÷ÓÃ×Ô¶¨Òå·þÎñµÄµØ·½£¬¶¼¿ÉÒÔÓõ½ LoggingServiceµÄʵÀý¡£

ºÜÒź¶£¬ÕâÖÖ²ÉÓù¤³§ÀàÀ´´´½¨¶ÔÏóµÄ·½·¨ËäÈ»£¨ÔÚÀíÂÛÉÏ£©±»Ö¤Ã÷ÊÇ¿ÉÐе쬵«£¨ÔÚʵ¼ÊÖУ©ÓÃÀ´ÊµÏÖÎÒÃÇÌá ³öµÄ@Log±ê×¢µÄÂß¼­£¬È´ÒÀÈ»·Ç³£À§ÄÑ£¬ÒòΪÕâÖÖ·½·¨±ØÐëÒªÈÃÿһ¸ö±ê×¢À඼ȥ¹¹½¨Ò»¸ö¶ÔÓ¦µÄ¹¤³§Àà·½·¨¡£ºÜÏÔÈ»£¬Õâô×ö»áÈÃÎÒÃǵĴúÂëÄ£°åµÄ³ß´çÏÔÖø Ôö³¤¡£¸üÓÐÉõÕߣ¬ÎªÁ˱ÜÃâÔÚ²úÉúÈÕÖ¾µÄ·½·¨ÖаÑÂß¼­Ð´ËÀ£¨Ó²±àÂ룩£¬ÎÒÃÇÉõÖÁ»áΪlogging±ê×¢Àà´´½¨²»Ö¹Ò»Ì×´úÂëÄ£°å¡£»¹ÓУ¬Èç¹ûÓÐÈ˲»Ð¡Ðĵ÷ÓÃÁË ¹¹Ô캯Êý£¬ÄÇô¾Í¿ÉÄÜ»áÓÐ΢ÃîµÄbug³öÏÖ£¬ÒòΪÔÚÕâÖÖÇé¿öÏ£¬²úÉúµÄ¶ÔÏóʵÀý¶Ô±ê×¢µÄ´¦Àí·½Ê½ºÜ¿ÉÄܸúÎÒÃÇÔ¤ÆÚµÄÊDz»Í¬µÄ¡£ÔÙÓУ¬¹¤³§ÀàµÄÉè¼ÆÆäʵ²¢²» ÈÝÒס£Èç¹ûÎÒÃÇÒªÌí¼ÓÒ»¸ö@Log±ê¼Çµ½Ä³Ò»¸öÀàÉÏÃæ£¬µ«ÊÇÕâ¸öÀàÒѾ­±»¶¨Òå³ÉÁËÒ»¸öHibernates beanÁË£¬ÄÇÔõô°ì£¿ ÕâÌýÉÏÈ¥ºÃÏñûʲôÒâÒ壬µ«ÊÇÔÚ²Ù×÷µÄʱºò¾Í±ØÐëÒªÉè¼Æ¶îÍâµÄÅäÖÃÈ¥°ÑÎÒÃǶ¨ÒåµÄ¹¤³§ÀàºÍ¿ò¼Ü×Ô´øµÄ¹¤³§ÀàÕûºÏÆðÀ´¡£×îºóÒ»µã£¬Ò²ÊǽáÂÛ£¬²ÉÓù¤³§Ä£Ê½Ð´ ³öµÄ´úÂëÓ·Öײ»¿°£¬Èç¹û»¹Òª×öµ½ÈÃÕâЩ´úÂëͬʱ¼æ±¸¿É¶ÁÐÔ£¬È»ºó»¹ÒªËùʹÓõĿò¼ÜÍêÃÀ½áºÏ£¬ÕâʵÏÖ´ú¼ÛҲ̫¸ßÁË¡£Õâ¾ÍÊÇΪʲôÎÒÃÇÒªÒýÈëJava agentµÄÔ­Òò¡£Java agentÕâÖÖ±»µÍ¹ÀÁ˵ÄģʽÄܹ»ÌṩһÖÖÓÅÐãµÄÌæ´ú·½°¸£¬ÓÃÀ´ÊµÏÖÎÒÃÇÏëÒªµÄ×ÓÀ໯·½·¨¡£

Ò»¸ö¼òµ¥µÄAgent

Java agentÊÇÓÃÒ»¸ö¼òµ¥µÄjarÎļþÀ´±íʾµÄ¡£¸úÆÕͨµÄJava³ÌÐòºÜÏàËÆ£¬Java agent¶¨ÒåÁËһЩÀà×÷ΪÈë¿Úµã¡£ ÕâЩ×÷ΪÈë¿ÚµãµÄÀàÐèÒª°üº¬Ò»¸ö¾²Ì¬·½·¨£¬ÕâЩ·½·¨»áÔÚÄãÔ­±¾µÄJava³ÌÐòµÄmain·½·¨µ÷ÓÃ֮ǰ±»µ÷Óãº

class MyAgent {
public static void premain(String args, Instrumentation inst) {
// implement agent here ...
}
}

¹ØÓÚ´¦ÀíJava agentʱ×îÓÐȤµÄ²¿·Ö£¬ÊÇpremain·½·¨Öеĵڶþ¸ö²ÎÊý¡£Õâ¸ö²ÎÊýÊÇÒÔÒ»¸öInstrumentation½Ó¿ÚµÄʵÏÖÀàʵÀýµÄÐÎʽ´æÔڵġ£Õâ¸ö½Ó ¿ÚÌṩÁËÒ»ÖÖ»úÖÆ£¬Äܹ»Í¨¹ý¶¨ÒåÒ»¸öClassFileTransformer£¬À´¸ÉÔ¤¶ÔJavaÀàµÄ¼ÓÔØ¹ý³Ì¡£ÓÐÁËÕâÖÖתÉèÊ©£¬ÎÒÃǾÍÄܹ»ÔÚJavaÀà ±»Ê¹ÓÃ֮ǰ£¬È¥ÊµÏÖ¶ÔÀàÂß¼­µÄÇ¿»¯¡£

Õâ¸öAPIµÄʹÓÃÒ»¿ªÊ¼¿´ÉÏÈ¥²»ÄÇôֱ¹Û£¬ºÜ¿ÉÄÜÊÇÒ»ÖÖÐµģ¨±à³Ìģʽ£©ÌôÕ½¡£ClassÎļþµÄת»»ÊÇͨ¹ýÐ޸ıà Òë¹ýºóµÄJavaÀà×Ö½ÚÂëÀ´Íê³ÉµÄ¡£ ʵ¼ÊÉÏ£¬JVM²¢²»ÖªµÀʲôÊÇJavaÓïÑÔ£¬ ËüÖ»ÖªµÀʲôÊÇ×Ö½ÚÂë¡£Ò²ÕýÊÇÒòΪ×Ö½ÚÂëµÄ³éÏóÌØÐÔ£¬²ÅÈÃJVMÄܹ»¾ßÓÐÔËÐжàÖÖÓïÑÔµÄÄÜÁ¦£¬ÀýÈçGroovy, ScalaµÈµÈ¡£ÕâÑùÒ»À´£¬Ò»¸ö×¢²áÁ˵ÄÀàÎļþת»»Æ÷¾ÍÖ»ÐèÒª¸ºÔð°ÑÒ»¸ö×Ö½ÚÂëÐòÁÐת»»³ÉÁíÍâÒ»¸ö×Ö½ÚÂëÐòÁоͿÉÒÔÁË¡£

¾¡¹ÜÒѾ­ÓÐÁËÏñASM¡¢BCELÕâÑùµÄÀà¿â£¬ÌṩÁËһЩ¼òÒ×µÄAPI£¬Äܹ»¶Ô±àÒë¹ýµÄJavaÀà½øÐвÙ×÷£¬µ«ÊÇʹÓÃÕâЩ¿âµÄÃż÷½Ï¸ß£¬ÐèÒª¿ª·¢Õß¶ÔԭʼµÄ×Ö ½ÚÂëµÄ¹¤×÷Ô­ÀíÓгä·ÖµÄÁ˽⡣¸ü¿ÉŵÄÊÇ£¬ÏëÖ±½Ó²Ù×÷×Ö½ÚÂë²¢×öµ½²»³öÎÊÌ⣬Õâ»ù±¾ÉϾÍÊÇÒ»¸öÈß³¤À­¾âµÄ¹ý³Ì£¬ÉõÖÁ·Ç³£Ï¸Î¢µÄ´íÎó£¬JVMÒ²»áÖ±½ÓÅ׳öÓÖ ³ôÓÖÓ²µÄVerifierError¡£²»¹ý»¹ºÃ£¬ÎÒÃÇ»¹ÓиüºÃ£¬¸ü¼òµ¥µÄÑ¡Ôñ£¬À´¶Ô×Ö½ÚÂë½øÐвÙ×÷¡£

Byte BuddyÕâÊÇÒ»¸öÎÒ±àд£¬²¢¸ºÔðά»¤µÄ¹¤¾ß¿â¡£Õâ¸ö¿âÌṩÁ˼ò½àµÄAPI£¬ÓÃÀ´¶Ô±àÒëºóµÄJava×Ö½ÚÂë½øÐвÙ×÷£¬Ò²¿ÉÒÔÓÃÀ´´´½¨Java agent. ´ÓijЩ·½ÃæÀ´¿´£¬Byte BuddyÒ²ÊÇÒ»¸ö´úÂëÉú³ÉµÄ¹¤¾ß¿â£¬ÕâºÍcglibÒÔ¼°JavassitµÄ¹¦ÄܺÜÀàËÆ¡£È»¶ø£¬¸úËûÃDz»Í¬µÄÊÇ£¬Byte Buddy»¹Äܹ»ÌṩͳһµÄAPI£¬ÊµÏÖ×ÓÀ໯£¬ÒÔ¼°Öض¨ÒåÏÖÓÐÀàµÄ¹¦ÄÜ¡£ÔÚ±¾ÎÄÖУ¬ÎÒÃÇÖ»»áÑо¿ÈçºÎÓÃJava agentÀ´Öض¨ÒåÒ»¸öÀà¡£Èç¹û¶ÁÕßÓиü¶àµÄÐËȤ£¬¿ÉÒÔ²ÎÕÕByte Buddy¡¯s webpage which offers a detailed tutorial £¬ÄǸöÀïÃæÓкÜÏêϸµÄÃèÊö¡£

ʹÓÃByte Buddy´´½¨simple agent

Byte BuddyÌṩµÄÒ»ÖÖ¶¨ÒåÊֶβÉÓÃÁËÒÀÀµ×¢ÈëµÄ·½·¨¡£ÆäÔ­ÀíÊÇÕâÑùµÄ£ºÊ¹ÓÃÒ»¸öÀ¹½ØÆ÷Àࡪ¡ªÕâ¸öÀàÊÇÒ»¸öPOJO¡ª¡ªÀ´»ñµÃ±ê×¢²ÎÊýËùÐèÒªµÄÐÅÏ¢¡£ÀýÈ磺 ½«Byte BuddyµÄ@Origin±êעʹÓÃÔÚÒ»¸öMethodÀàÐ͵IJÎÊýÉÏ£¬Byte Buddy¼´¿ÉÍÆÑݳöÀ¹½ØÆ÷ĿǰҪÀ¹½ØµÄ¾ÍÊÇmethod±äÁ¿¡£ÕâÑù£¬ÎÒÃǾͿÉÒÔ¶¨ÒåÒ»¸ö·ºÐ͵ÄÀ¹½ØÆ÷£¬Ö»ÒªmethodÒ»³öÏÖ£¬¾Í»á±»À¹½ØÆ÷À¹½Ø¡£

class LogInterceptor {
static void log(@Origin Method method) {
Logger.log(method + " was called");
}
}

µ±È»£¬Byte Buddy¿ÉÒÔ×÷ÓÃÓÚ¶à¸ö±ê×¢ÉÏ¡£

µ«ÊÇ£¬ÕâЩÀ¹½ØÆ÷ÈçºÎÄܹ»±íʾÎÒÃÇÌá³öµÄÈÕÖ¾¿ò¼ÜËùÐèÒªµÄ´úÂëÂß¼­ÄØ£¿µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃǽö½öÊǶ¨ÒåÁËÒ»¸öÀ¹½ØÆ÷£¬ÓÃÀ´À¹½ØÎÒÃǵÄmethodµ÷Ó᣻¹È±ÉÙ¶Ô ÓÚmethodËùÔÚµÄԭʼ´úÂëÐòÁеĵ÷Óá£ÐÒÔ˵ÄÊÇ£¬Byte BuddyÌṩµÄÊÖ¶ÎÊÇ¿É×éºÏ£¨compose£©µÄ¡£Ê×ÏÈÎÒÃǶ¨ÒåÒ»¸öMethodDelegationÀ࣬²¢½«Æä×éºÏµ½LogInterceptor ÖУ¬Õâ¸öÀ¹½ØÆ÷Àà»áÔÚÿһ´Îmethod±»µ÷ÓõÄʱºòȥĬÈϵ÷ÓÃÀ¹½ØÆ÷µÄ¾²Ì¬·½·¨¡£ÒÔ´ËΪÆðµã£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÒ»ÖÖÐòÁе÷Óõķ½Ê½£¬½«´úÀíÀàºÍÔ­Ïȵ÷Óà methodµÄ´úÂë×éºÏÆðÀ´£¬¾Í¸úSuper MethodCall±íʾµÄÒ»Ñù£º

class LogAgent {
MethodDelegation.to(LogInterceptor.class)
.andThen(SuperMethodCall.INSTANCE)
}

×îºó£¬ÎÒÃÇ»¹ÐèҪ֪ͨByte Buddy£¬½«±»À¹½ØµÄ·½·¨ÓëÌØ¶¨µÄÂß¼­°ó¶¨¡£¾ÍÏñÎÒÃÇÔÚÇ°Ãæ²ûÊöµÄÒ»Ñù£¬ÎÒÃÇÏë°ÑÒ»¶ÎÂß¼­£¨¾ÍÊǼǼÈÕÖ¾µÄ¹¦ÄÜ¡ª¡ªÒëÕß×¢£©Ê©¼Óµ½Ã¿Ò»¸ö¼ÓÁË@Log±ê ×¢µÄµØ·½¡£ÔÚByte BuddyÖУ¬Í¨¹ýʹÓÃElementMatcher·½·¨£¬£¨±»±ê×¢µÄ£©·½·¨¾Í»á±»Ê¶±ð³öÀ´£¬ÕâºÍJava 8µÄ¶ÏÑÔ»úÖÆºÜÀàËÆ¡£ÔÚ¾²Ì¬¹¤¾ßÀàElementMatcherÖУ¬ÎÒÃÇ¿ÉÒÔÓÃÏàÓ¦µÄmatcherÀ´Ê¶±ðÎÒÃÇ£¨ÓÃ@Log£©±ê×¢ºóµÄ·½ ·¨£ºElementMatchers.isAnnotatedWith(Log.class)¡£

ͨ ¹ýÉÏÊöµÄ·½Ê½£¬ÎÒÃǾÍʵÏÖÒ»¸öagentµÄ¶¨Ò壬¿ÉÒÔÍê³ÉÎÒÃÇÌá³ölogging frameworkµÄÒªÇ󡣾͸úÎÒÃÇÔÚǰÎÄÐðÊöµÄÔ­ÀíÒ»Ñù£¬Byte BuddyÌṩÁËÒ»Ì×¹¤¾ßAPIÀ´¹¹½¨Java agent£¬ÕâЩ¹¤¾ßAPIÔòÊÇ»ùÓڿɶԣ¨±àÒëºóµÄ£©class½øÐÐÐ޸ĵģ¨JavaEEÔ­Éú£©API¡£¾Í¸úÏÂÃæÕâ¶ÎAPIÒ»Ñù£¬ÆäÉè¼ÆÉÏÓëÃæÏòÁìÓòÓïÑÔ ÏàËÆ£¬´Ó´úÂëµÄ×ÖÃæÉϾͿÉÒÔÇáËÉŪ¶®Æäº¬Òå¡£ÏÔÈ»£¬¶¨ÒåÒ»¸öagent¾Í½ö½öÐèÒª¼¸ÐдúÂë¶øÒÑ£º

class LogAgent {
public static void premain(String args, Instrumentation inst) {
new AgentBuilder.Default()
.rebase(ElementMatchers.any())
.transform( builder -> return builder
.method(ElementMatchers.isAnnotatedWith(Log.class))
.intercept(MethodDelegation.to(LogInterceptor.class)
.andThen(SuperMethodCall.INSTANCE)) )
.installOn(inst);
}
}

×¢Ò⣬ÉÏÃæÕâ¶Î×î¼òJava agent´úÂë²»»á¶ÔÔ­ÓеĴúÂë²úÉú¸ÉÈÅ¡£¶ÔÓÚÒÑÓеĴúÂëÀ´Ëµ£¬¸½¼ÓµÄÂß¼­´úÂë¾Í·Â·ðÊÇÖ±½Ó°ÑÓ²±àÂë²åÈëµ½´øÓбê×¢µÄ·½·¨´¦Ò»Ñù£¨ÀàËÆÓÚC++ÄÚÁªµÄЧ¹û¡ª¡ªÒëÕß×¢£©

ÏÖʵÇé¿öÊÇÔõÑùµÄ£¿

µ±È»£¬ÎÒÃÇÔÚÕâÀïչʾµÄ»ùÓÚagentµÄloggerÖ»ÊÇÒ»¸ö½ÌѧÀý×Ó¡£Í¨³£Çé¿öÏ£¬ÄÇЩ¸²¸ÇÃæºÜ¹ãµÄ¿ò¼ÜÒ²¶¼»áÌṩÀàËÆµÄ ¹¦ÄÜÌØÐÔ£¬Ö±½Óµ÷Óü´¿É¡£ÀýÈçSpring»òÕßDropwizardµÄÀàËÆ¹¦Äܶ¼ºÜºÃÓá£È»¶ø£¬ÕâЩ¿ò¼ÜÌṩµÄ¹¦ÄÜ»ù±¾É϶¼×ÅÑÛÓÚ´¦Àí£¨¾ßÌåµÄ£©±à³ÌÎÊ Ìâ¡£¶Ô´ó¶àÊýÈí¼þÓ¦ÓÃÀ´Ëµ£¬ÕâÖÖ˼·ҲÐí»¹²»´í¡£ÔÙÕߣ¬ÕâЩ¿ò¼ÜµÄ˼·ÓÐʱҲ×ÅÑÛÓÚ´ó¹æÄ£µÄ£¨Ó¦Óã©¡£Èç´ËÒ»À´£¬Ê¹ÓÃÕâЩ¿ò¼ÜÀ´×öÊ£¬¾ÍÓпÉÄÜÔì³ÉºÜ¶àÎÊ Ì⣬ͨ³£ÊǻᵼÖÂÓЩ¶´µÄ³éÏóÂß¼­£¬²¢¿ÉÄܽøÒ»²½Ôì³ÉÈí¼þÔËά³É±¾µÄ±¬Õ¨ÐÔÔö³¤¡£ÕâÖÖ¼ÙÉè¾ø¶Ô²»ÊÇΣÑÔËÊÌý£¬ÌرðÊÇÔÚÄãµÄÓ¦ÓùæÄ£Ôö³¤£¬ÐèÇó±ä¸üƵ·±ºÍ·Ö ²æµÄʱºò£¬ÓÖÒªÓÿò¼ÜÌṩµÄ¹¦ÄÜÀ´½â¾öÎÊÌ⣬¾ÍºÜ¿ÉÄܳöÏÖÉÏÊöÂé·³¡£

Ïà·´µÄ×ö·¨£¬ÎÒÃÇ¿ÉÒÔÈ¥¹¹½¨Ò»¸ö¸ü¼ÓÓÐÕë¶ÔÐԵĿò¼Ü»òÕßÀà¿â£¬²ÉÓá°ÌôÑ¡&ÈÚÈ롱µÄ·ç¸ñ£¬Ã¿´ÎÓÃÒ»¸öÍ걸µÄ×é¼þÈ¥Ìæ»»Ô­ÓеĴæÔÚÎÊÌâµÄ×é¼þ¡£Èç¹ûÕâÑù»¹²»Äܽâ¾öÎÊÌ⣬ÎÒÃÇ»¹¿ÉÒԸɴàÈ¥¸ãÒ»¸ö×Ô¶¨ÒåµÄ½â¾ö ·½°¸£¬²¢±£Ö¤ÐµĽâ¾ö·½°¸²»»áÓ°Ïìµ½Ó¦ÓÃÖеÄÔ­ÓдúÂë¡£¾ÝÎÒÃÇËùÖª£¬µÚ¶þÖÖ×ö·¨¶ÔÓÚJVMÀ´ËµÊµÏÖÆðÀ´ÓÐЩÀ§ÄÑ£¬Ö÷ÒªÔ­ÒòÊÇÒòΪJavaµÄÇ¿ÀàÐÍ»úÖÆÔì³É µÄ¡£²»¹ý£¬Í¨¹ýʹÓÃJava agents£¬¿Ë·þÕâЩÀàÐÍÏÞÖÆÒ²²»ÊÇÍêÈ«²»¿ÉÄܵġ£

¸ÅÀ¨µØÀ´Ëµ£¬ÎÒÈÏΪËùÓÐÉæ¼°µ½ºáÏò²Ù×÷µÄ¸ÅÄ¶¼Ó¦¸Ã²ÉÓÃagentÇý¶¯µÄ·½Ê½ À´ÊµÏÖ£¬²¢ÇÒÓ¦¸ÃʹÓÃÕë¶ÔÐԵĿò¼Ü£¬¶ø²»ÊDzÉÓÃÄÇЩ´óµÃÏÅËÀÈ˵Ŀò¼Ü¸øÄãÌṩµÄÄÚÖ÷½·¨¡£ÎÒÒ²ÕæÐÄÏ£ÍûÓиü¶àµÄÓ¦ÓÃÄܹ»¿¼ÂDzÉÓÃÉÏÊöµÄ·½·¨¡£ÔÚÒ»°ãÇé¿ö Ï£¬Ê¹ÓÃagentÀ´×¢²áÌØ¶¨·½·¨µÄlistener£¬²¢¼ÓÒÔʵÏÖ£¬ÊÇÍêÈ«¿ÉÒÔÂú×ãÐèÇóµÄ¡£¸ù¾ÝÎÒ¶Ô´óÌå»ýJavaÓ¦ÓôúÂëµÄ¹Û²ì£¬ÕâÖÖ¼ä½ÓµÄÄ£¿é±àÂë·½ ·¨Äܹ»±ÜÃ⣨ģ¿é¼ä£©µÄÇ¿ñîºÏÐÔ¡£»¹ÓÐÒ»¸öÌðÃ۵ĸ±×÷ÓþÍÊÇ£¬ÕâÖÖ·½·¨ÈôúÂëµÄ²âÊÔ±äµÃºÜÈÝÒס£¸ú²âÊÔµÄÔ­ÀíÏàͬ£¬ÔÚÆô¶¯Ó¦ÓõÄʱºò²»¼ÓÔØagent£¬¾Í Äܰ´Ðè¹Ø±ÕÏàÓ¦µÄÓ¦ÓÃÌØÐÔ£¨ÀýÈç±¾ÎÄÖеÄloggingÀý×Ó£©¡£ËùÓÐÕâЩ²Ù×÷¶¼²»ÐèÒª¸Ä¶¯ÈκÎÒ»ÐдúÂ룬Ҳ¾Í²»»áÔì³É³ÌÐòµÄ±ÀÀ££¬ÒòΪJVM»á×Ô¶¯ºöÂÔµô ÄÇЩÔÚÔËÐÐʱÎÞ·¨½âÎöµÄ±ê×¢¡£°²È«¡¢ÈÕÖ¾¡¢»º´æ»¹ÓкܶàÆäËûµÄ·½Ã棬ÓкܶàÀíÓÉ£¬ÐèÒª²ÉÓñ¾Îĵķ½Ê½À´´¦Àí¡£Òò´Ë£¬ÎÒÃÇҪ˵£¬²ÉÓÃagent£¬²»ÒªÓÿò¼Ü¡£

   
2334 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö


Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ


Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ