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£¬²»ÒªÓÿò¼Ü¡£ |