ºìÁªLinuxÃÅ»§
Linux°ïÖú

ÌåÑéJava 1.5ÖÐÃæÏò(AOP)±à³Ì

·¢²¼Ê±¼ä:2005-05-09 21:52:33À´Ô´:ºìÁª×÷Õß:wade9900
¶ÔÓÚÒ»¸öÄܹ»·ÃÎÊÔ´´úÂëµÄ¾­Ñé·á¸»µÄJava¿ª·¢ÈËÔ±À´Ëµ£¬ÈκγÌÐò¶¼¿ÉÒÔ±»¿´×÷ÊDz©Îï¹ÝÀï͸Ã÷µÄÄ£ÐÍ¡£ÀàËÆÏß³Ìת´¢£¨dump£©¡¢·½·¨µ÷Óøú×Ù¡¢¶Ïµã¡¢ÇÐÃ棨profiling£©Í³¼Æ±íµÈ¹¤¾ß¿ÉÒÔÈÃÎÒÃÇÁ˽â³ÌÐòÄ¿Ç°ÕýÔÚÖ´ÐÐʲô²Ù×÷¡¢¸Õ²Å×öÁËʲô²Ù×÷¡¢Î´À´½«×öʲô²Ù×÷¡£µ«ÊÇÔÚ²úÆ·»·¾³ÖÐÇé¿ö¾ÍûÓÐÄÇôÃ÷ÏÔÁË£¬ÕâЩ¹¤¾ßÒ»°ãÊDz»Äܹ»Ê¹Óõģ¬»ò×î¶àÖ»ÄÜÓÉÊܹýѵÁ·µÄ¿ª·¢ÕßʹÓá£Ö§³ÖÍŶӺÍ×îÖÕÓû§Ò²ÐèÒªÖªµÀÔÚij¸öʱ¿ÌÓ¦ÓóÌÐòÕýÔÚÖ´ÐÐʲô²Ù×÷¡£

¡¡¡¡ÎªÁËÌî²¹Õâ¸ö¿Õȱ£¬ÎÒÃÇÒѾ­·¢Ã÷ÁËһЩ¼òµ¥µÄÌæ´úÆ·£¬ÀýÈçÈÕÖ¾Îļþ£¨µäÐÍÇé¿öÏÂÓÃÓÚ·þÎñÆ÷´¦Àí£©ºÍ״̬Ìõ£¨ÓÃÓÚGUIÓ¦ÓóÌÐò£©¡£µ«ÊÇ£¬ÓÉÓÚÕâЩ¹¤¾ßÖ»Äܲ¶×½ºÍ±¨¸æ¿ÉÓÃÐÅÏ¢µÄÒ»¸öºÜСµÄ×Ó¼¯£¬²¢ÇÒͨ³£±ØÐë°ÑÕâЩÐÅÏ¢ÓÃÈÝÒ×Àí½âµÄ·½Ê½±íÏÖ³öÀ´£¬ËùÒÔ³ÌÐòÔ±Ç÷ÏòÓÚ°ÑËüÃÇÃ÷È·µØ±àдµ½Ó¦ÓóÌÐòÖС£¶øÕâЩ´úÂë»á²øÈÆ×ÅÓ¦ÓóÌÐòµÄÒµÎñÂß¼­£¬µ±¿ª·¢ÕßÊÔͼµ÷ÊÔ»òÁ˽âºËÐŦÄܵÄʱºò£¬ËûÃDZØÐë"ΧÈÆÕâЩ´úÂ빤×÷"£¬¶øÇÒ»¹Òª¼ÇµÃ¹¦ÄÜ·¢Éú¸Ä±äºó¸üÐÂÕâЩ´úÂë¡£ÎÒÃÇÏ£ÍûʵÏÖµÄÕæÕý¹¦ÄÜÊÇ°Ñ״̬±¨¸æ¼¯ÖÐÔÚij¸öλÖ㬰ѵ¥¸ö״̬ÏûÏ¢×÷ΪԪÊý¾Ý£¨metadata£©À´¹ÜÀí¡£

¡¡¡¡ÔÚ±¾ÎÄÖÐÎÒ½«¿¼ÂÇʹÓÃǶÈëGUIÓ¦ÓóÌÐòÖеÄ״̬Ìõ×é¼þµÄÇéÐΡ£ÎÒ½«½éÉܶàÖÖʵÏÖÕâÖÖ״̬±¨¸æµÄ²»Í¬·½·¨£¬´Ó´«Í³µÄÓ²±àÂëÏ°¹ß¿ªÊ¼¡£ËæºóÎÒ»á½éÉÜJava 1.5µÄ´óÁ¿ÐÂÌØÐÔ£¬°üÀ¨×¢½â£¨annotation£©ºÍÔËÐÐʱ×Ö½ÚÂëÖع¹£¨instrumentation£©¡£

¡¡¡¡×´Ì¬¹ÜÀíÆ÷£¨StatusManager£©

¡¡¡¡ÎÒµÄÖ÷ҪĿ±êÊǽ¨Á¢Ò»¸ö¿ÉÒÔǶÈëGUIÓ¦ÓóÌÐòµÄJStatusBar Swing×é¼þ¡£Í¼1ÏÔʾÁËÒ»¸ö¼òµ¥µÄJframeÖÐ״̬ÌõµÄÑùʽ¡£
http://www.it.com.cn/f/edu/052/21/050213.jpg
ÓÉÓÚÎÒ²»Ï£ÍûÖ±½ÓÔÚÒµÎñÂß¼­ÖÐÒýÓÃÈκÎGUI×é¼þ£¬ÎÒ½«½¨Á¢Ò»¸öStatusManager£¨×´Ì¬¹ÜÀíÆ÷£©À´³äµ±×´Ì¬¸üеÄÈë¿Úµã¡£Êµ¼ÊµÄ֪ͨ»á±»Î¯ÍиøStatusState¶ÔÏó£¬Òò´ËÒÔºó¿ÉÒÔÀ©Õ¹ËüÒÔÖ§³Ö¶à¸ö²¢·¢µÄÏ̡߳£Í¼2ÏÔʾÁËÕâÖÖ°²ÅÅ¡£
http://www.it.com.cn/f/edu/052/21/050214.jpg
ÏÖÔÚÎÒ±ØÐë±àд´úÂëµ÷ÓÃStatusManagerµÄ·½·¨À´±¨¸æÓ¦ÓóÌÐòµÄ½ø³Ì¡£µäÐÍÇé¿öÏ£¬ÕâЩ·½·¨µ÷Óö¼·ÖÉ¢µØ¹á´©ÓÚtry-finally´úÂë¿éÖУ¬Í¨³£Ã¿¸ö·½·¨Ò»¸öµ÷Óᣠ¡¡¡¡

¡¡¡¡public void connectToDB (String url) {
¡¡¡¡¡¡StatusManager.push("Connecting to database");
¡¡¡¡¡¡try {
¡¡¡¡¡¡¡¡...
¡¡¡¡¡¡} finally {
¡¡¡¡¡¡¡¡StatusManager.pop();
¡¡¡¡¡¡}
¡¡¡¡}

¡¡¡¡ÕâЩ´úÂëʵÏÖÁËÎÒÃÇËùÐèÒª¹¦ÄÜ£¬µ«ÊÇÔÚ´úÂë¿âÖÐÊýÊ®´Î¡¢ÉõÖÁÓÚÊý°Ù´ÎµØ¸´ÖÆÕâЩ´úÂëÖ®ºó£¬Ëü¿´ÆðÀ´¾ÍÓÐЩ»ìÂÒÁË¡£´ËÍ⣬Èç¹ûÎÒÃÇÏ£ÍûÓÃһЩÆäËüµÄ·½Ê½·ÃÎÊÕâЩÏûÏ¢¸ÃÔõô°ìÄØ£¿ÔÚ±¾ÎĵĺóÃ沿·ÖÖУ¬ÎÒ½«¶¨ÒåÒ»¸öÓû§ÓѺõÄÒì³£´¦Àí³ÌÐò£¬Ëü¹²ÏíÁËÏàͬµÄÏûÏ¢¡£ÎÊÌâÊÇÎÒ°Ñ״̬ÏûÏ¢Òþ²ØÔÚ·½·¨µÄʵÏÖÖ®ÖÐÁË£¬¶øûÓаÑÏûÏ¢·ÅÔÚÏûÏ¢ËùÊôµÄ½Ó¿ÚÖС£

¡¡¡¡ÃæÏòÊôÐÔ±à³Ì

¡¡¡¡ÎÒÕæÕýÏëʵÏֵIJÙ×÷ÊǰѶÔStatusManagerµÄÒýÓö¼·Åµ½´úÂëÍâÃæµÄij¸öµØ·½£¬²¢¼òµ¥µØÓÃÎÒÃǵÄÏûÏ¢±ê¼ÇÕâ¸ö·½·¨¡£½Ó×ÅÎÒ¿ÉÒÔʹÓôúÂëÉú³É£¨code-generation£©»òÔËÐÐʱ·´Ê¡£¨introspection£©À´Ö´ÐÐÕæÕýµÄ¹¤×÷¡£XDocletÏîÄ¿°ÑÕâÖÖ·½·¨¹éÄÉΪÃæÏòÊôÐÔ±à³Ì£¨Attribute-Oriented Programming£©£¬Ëü»¹ÌṩÁËÒ»¸ö¿ò¼Ü×é¼þ£¬¿ÉÒÔ°Ñ×Ô¶¨ÒåµÄÀàËÆJavadocµÄ±ê¼Çת»»µ½Ô´´úÂëÖ®ÖС£

¡¡¡¡µ«ÊÇ£¬JSR-175°üº¬ÁËÕâÑùµÄÄÚÈÝ£¬Java 1.5ΪÁË°üº¬Õæʵ´úÂëÖеÄÕâЩÊôÐÔÌṩÁËÒ»Öֽṹ»¯³Ì¶È¸ü¸ßµÄ¸ñʽ¡£ÕâЩÊôÐÔ±»³ÆΪ"×¢½â£¨annotations£©"£¬ÎÒÃÇ¿ÉÒÔʹÓÃËüÃÇΪÀà¡¢·½·¨¡¢×ֶλò±äÁ¿¶¨ÒåÌṩԪÊý¾Ý¡£ËüÃDZØÐë±»ÏÔʽÉùÃ÷£¬²¢Ìṩһ×é¿ÉÒÔ°üº¬ÈÎÒâ³£Á¿Öµ£¨°üÀ¨Ô­Óï¡¢×Ö·û´®¡¢Ã¶¾ÙºÍÀࣩµÄÃû³Æ-Öµ¶Ô£¨name-value pair£©¡£

¡¡¡¡×¢½â£¨Annotations£©

¡¡¡¡ÎªÁË´¦Àí״̬ÏûÏ¢£¬ÎÒÏ£Íû¶¨ÒåÒ»¸ö°üº¬×Ö·û´®ÖµµÄÐÂ×¢½â¡£×¢½âµÄ¶¨Òå·Ç³£ÀàËƽӿڵĶ¨Ò壬µ«ÊÇËüÓÃ@interface¹Ø¼ü×Ö´úÌæÁËinterface£¬²¢ÇÒÖ»Ö§³Ö·½·¨£¨¾¡¹ÜËüÃǵŦÄܸüÏñ×ֶΣ©£º ¡¡¡¡

¡¡¡¡public @interface Status {
¡¡¡¡¡¡String value();
¡¡¡¡}

¡¡¡¡Óë½Ó¿ÚÀàËÆ£¬ÎÒ°Ñ@interface·ÅÈëÒ»¸ö½Ð×öStatus.javaµÄÎļþÖУ¬²¢°ÑËüµ¼Èëµ½ÈκÎÐèÒªÒýÓÃËüµÄÎļþÖС£

¡¡¡¡¶ÔÎÒÃǵÄ×Ö¶ÎÀ´Ëµ£¬value¿ÉÄÜÊǸöÆæ¹ÖµÄÃû³Æ¡£ÀàËÆmessageµÄÃû³Æ¿ÉÄܸüÊʺϣ»µ«ÊÇ£¬value¶ÔÓÚJavaÀ´Ëµ¾ßÓÐÌØÊâµÄÒâÒå¡£ËüÔÊÐíÎÒÃÇʹÓÃ@Status("...")´úÌæ@Status(value="...")À´¶¨Òå×¢½â£¬ÕâÃ÷ÏÔ¸ü¼Ó¼ò½Ý¡£

¡¡¡¡ÎÒÏÖÔÚ¿ÉÒÔʹÓÃÏÂÃæµÄ´úÂ붨Òå×Ô¼ºµÄ·½·¨£º

¡¡¡¡@Status("Connecting to database")
¡¡¡¡public void connectToDB (String url) {
¡¡¡¡...
¡¡¡¡}

¡¡¡¡Çë×¢Ò⣬ÎÒÃÇÔÚ±àÒëÕâ¶Î´úÂëµÄʱºò±ØÐëʹÓÃ-source 1.5Ñ¡Ïî¡£Èç¹ûÄãʹÓÃAnt¶ø²»ÊÇÖ±½ÓʹÓÃjavacÃüÁîÐн¨Á¢Ó¦ÓóÌÐò£¬ÄÇôÄãÐèҪʹÓÃAnt 1.6.1ÒÔÉÏ°æ±¾¡£

¡¡¡¡×÷ΪÀà¡¢·½·¨¡¢×ֶκͱäÁ¿µÄ²¹³ä£¬×¢½âÒ²¿ÉÒÔÓÃÓÚΪÆäËüµÄ×¢½âÌṩԪÊý¾Ý¡£ÌرðµØ£¬JavaÒýÈëÁËÉÙÁ¿×¢½â£¬Äã¿ÉÒÔʹÓÃÕâЩע½âÀ´¶¨ÖÆÄã×Ô¼ºµÄ×¢½âµÄ¹¤×÷·½Ê½¡£ÎÒÃÇÓÃÏÂÃæµÄ´úÂëÖØж¨Òå×Ô¼ºµÄ×¢½â£º

¡¡¡¡@Target(ElementType.METHOD)
¡¡¡¡@Retention(RetentionPolicy.SOURCE)
¡¡¡¡public @interface Status {
¡¡¡¡String value();
¡¡¡¡}

¡¡¡¡@Target×¢½â¶¨ÒåÁË@Status×¢½â¿ÉÒÔÒýÓÃʲôÄÚÈÝ¡£ÀíÏëÇé¿öÏ£¬ÎÒÏ£Íû±ê¼Ç´ó¿éµÄ´úÂ룬µ«ÊÇËüµÄÑ¡ÏîÖ»Óз½·¨¡¢×ֶΡ¢Àà¡¢±¾µØ±äÁ¿¡¢²ÎÊýºÍÆäËü×¢½â¡£ÎÒÖ»¶Ô´úÂë¸ÐÐËȤ£¬Òò´ËÎÒÑ¡ÔñÁËMETHOD£¨·½·¨£©¡£

¡¡¡¡@Retention×¢½âÔÊÐíÎÒÃÇÖ¸¶¨Javaʲôʱºò¿ÉÒÔ×ÔÖ÷µØÅ×ÆúÏûÏ¢¡£Ëü¿ÉÄÜÊÇSOURCE£¨ÔÚ±àÒëʱÅ×Æú£©¡¢CLASS£¨ÔÚÀàÔØÈëʱÅ×Æú£©»òRUNTIME£¨²»Å×Æú£©¡£ÎÒÃÇÏÈÑ¡ÔñSOURCE£¬µ«ÊÇÔÚ±¾Îĺó²¿ÎÒÃÇ»á¸üÐÂËü¡£

Öع¹Ô´´úÂë

¡¡¡¡ÏÖÔÚÎÒµÄÏûÏ¢¶¼±»±àÂë·ÅÈëÔªÊý¾ÝÖÐÁË£¬ÎÒ±ØÐë±àдһЩ´úÂëÀ´Í¨Öª×´Ì¬¼àÌý³ÌÐò¡£¼ÙÉèÔÚij¸öʱºò£¬ÎÒ¼ÌÐø°ÑconnectToDB·½·¨±£´æÔ´´úÂë¿Ø¼þÖУ¬µ«ÊÇȴûÓжÔStatusManagerµÄÈκÎÒýÓᣵ«ÊÇ£¬ÔÚ±àÒëÕâ¸öÀà֮ǰ£¬ÎÒÏ£Íû¼ÓÈëһЩ±ØÒªµÄµ÷Óá£Ò²¾ÍÊÇ˵£¬ÎÒÏ£Íû×Ô¶¯µØ²åÈëtry-finallyÓï¾äºÍpush/popµ÷Óá£

¡¡¡¡XDoclet¿ò¼Ü×é¼þÊÇÒ»ÖÖJavaÔ´´úÂëÉú³ÉÒýÇ棬ËüʹÓÃÁËÀàËÆÉÏÊöµÄ×¢½â£¬µ«ÊÇ°ÑËüÃÇ´æ´¢ÔÚJavaÔ´´úÂëµÄ×¢ÊÍ£¨comment£©ÖС£XDocletÉú³ÉÕû¸öJavaÀà¡¢ÅäÖÃÎļþ»òÆäËü½¨Á¢µÄ²¿·ÖµÄʱºò·Ç³£ÍêÃÀ£¬µ«ÊÇËü²»Ö§³Ö¶ÔÒÑÓÐJavaÀàµÄÐ޸ģ¬¶øÕâÏÞÖÆÁËÖع¹µÄÓÐЧÐÔ¡£×÷Ϊ´úÌ棬ÎÒ¿ÉÒÔʹÓ÷ÖÎö¹¤¾ß£¨ÀýÈçJavaCC»òANTLR£¬ËüÌṩÁË·ÖÎöJavaÔ´´úÂëµÄÓï·¨»ù´¡£©£¬µ«ÊÇÕâÐèÒª»¨·Ñ´óÁ¿¾«Á¦¡£

¡¡¡¡¿´ÆðÀ´Ã»ÓÐʲô¿ÉÒÔÓÃÓÚJava´úÂëµÄÔ´´úÂëÖع¹µÄºÜºÃµÄ¹¤¾ß¡£ÕâÀ๤¾ß¿ÉÄÜÓÐÊг¡£¬µ«ÊÇÄãÔÚ±¾ÎĵĺóÃ沿·Ö¿ÉÒÔ¿´µ½£¬×Ö½ÚÂëÖع¹¿ÉÄÜÊÇÒ»ÖÖ¸üÇ¿´óµÄ¼¼Êõ¡£ Öع¹×Ö½ÚÂë

¡¡¡¡²»ÊÇÖع¹Ô´´úÂëÈ»ºó±àÒëËü£¬¶øÊDZàÒëԭʼµÄÔ´´úÂ룬ȻºóÖع¹ËüËù²úÉúµÄ×Ö½ÚÂë¡£ÕâÑùµÄ²Ù×÷¿ÉÄܱÈÔ´´úÂëÖع¹¸üÈÝÒ×£¬Ò²¿ÉÄܸü¼Ó¸´ÔÓ£¬¶øÕâÒÀÀµÓÚÐèÒªµÄ׼ȷת»»¡£×Ö½ÚÂëÖع¹µÄÖ÷ÒªÓŵãÊÇ´úÂë¿ÉÒÔÔÚÔËÐÐʱ±»Ð޸ģ¬²»ÐèҪʹÓñàÒëÆ÷¡£

¡¡¡¡¾¡¹ÜJavaµÄ×Ö½ÚÂë¸ñʽÏà¶Ô¼òµ¥£¬ÎÒ»¹ÊÇÏ£ÍûʹÓÃÒ»¸öJavaÀà¿âÀ´Ö´ÐÐ×Ö½ÚÂëµÄ·ÖÎöºÍÉú³É£¨Õâ¿ÉÒÔ°ÑÎÒÃÇÓëδÀ´JavaÀàÎļþ¸ñʽµÄ¸Ä±ä¸ôÀ뿪À´£©¡£ÎÒÑ¡ÔñÁËʹÓÃJakartaµÄByte Code Engineering Library£¨×Ö½ÚÂëÒýÇæÀà¿â£¬BCEL£©£¬µ«ÊÇÎÒ»¹¿ÉÒÔÑ¡ÓÃCGLIB¡¢ASM»òSERP¡£

¡¡¡¡ÓÉÓÚÎÒ½«Ê¹ÓöàÖÖ²»Í¬µÄ·½Ê½Öع¹×Ö½ÚÂ룬ÎÒ½«´ÓÉùÃ÷Öع¹µÄͨÓýӿڿªÊ¼¡£ËüÀàËÆÓÚÖ´ÐлùÓÚ×¢½âÖع¹µÄ¼òµ¥¿ò¼Ü×é¼þ¡£Õâ¸ö¿ò¼Ü×é¼þ»ùÓÚ×¢½â£¬½«Ö§³ÖÀàºÍ·½·¨µÄת»»£¬Òò´Ë¸Ã½Ó¿ÚÓÐÀàËÆÏÂÃæµÄ¶¨Ò壺¡¡¡¡

¡¡¡¡public interface Instrumentor
¡¡¡¡{
¡¡¡¡¡¡public void instrumentClass (ClassGen classGen,Annotation a);
¡¡¡¡¡¡public void instrumentMethod (ClassGen classGen,MethodGen methodGen,Annotation a);
¡¡¡¡}

¡¡¡¡ClassGenºÍMethodGen¶¼ÊÇBCELÀ࣬ËüÃÇʹÓÃÁËBuilderģʽ£¨pattern£©¡£Ò²¾ÍÊÇ˵£¬ËüÃÇΪ¸Ä±äÆäËü²»¿É±äµÄ£¨immutable£©¶ÔÏó¡¢ÒÔ¼°¿É±äµÄºÍ²»¿É±äµÄ±íÏÖ£¨representation£©Ö®¼äµÄת»»ÌṩÁË·½·¨¡£

¡¡¡¡ÏÖÔÚÎÒÐèҪΪ½Ó¿Ú±àдʵÏÖ£¬Ëü±ØÐëÓÃÇ¡µ±µÄStatusManagerµ÷Óøü»»@Status×¢½â¡£Ç°ÃæÌáµ½£¬ÎÒÏ£Íû°ÑÕâЩµ÷Óðüº¬ÔÚtry-finally´úÂë¿éÖС£Çë×¢Ò⣬Ҫ´ïµ½Õâ¸öÄ¿±ê£¬ÎÒÃÇËùʹÓõÄ×¢½â±ØÐëÓÃ@Retention(RetentionPolicy.CLASS)½øÐбê¼Ç£¬ËüָʾJava±àÒëÆ÷ÔÚ±àÒë¹ý³ÌÖв»ÒªÅ×Æú×¢½â¡£ÓÉÓÚÔÚÇ°ÃæÎÒ°Ñ@StatusÉùÃ÷Ϊ@Retention(RetentionPolicy.SOURCE)µÄ£¬ÎÒ±ØÐë¸üÐÂËü¡£

¡¡¡¡ÔÚÕâÖÖÇé¿öÏ£¬Öع¹×Ö½ÚÂëÃ÷ÏÔ±ÈÖع¹Ô´´úÂë¸ü¸´ÔÓ¡£ÆäÔ­ÒòÔÚÓÚtry-finallyÊÇÒ»ÖÖ½ö½ö´æÔÚÓÚÔ´´úÂëÖеĸÅÄî¡£Java±àÒëÆ÷°Ñtry-finally´úÂë¿éת»»ÎªÒ»ÏµÁеÄtry-catch´úÂë¿é£¬²¢ÔÚÿһ¸ö·µ»Ø֮ǰ²åÈë¶Ôfinally´úÂë¿éµÄµ÷Óá£Òò´Ë£¬ÎªÁË°Ñtry-finally´úÂë¿éÌí¼Óµ½ÒÑÓеÄ×Ö½ÚÂëÖУ¬ÎÒÒ²±ØÐëÖ´ÐÐÀàËƵÄÊÂÎñ¡£

¡¡¡¡ÏÂÃæÊDZíÏÖÒ»¸öÆÕͨ·½·¨µ÷ÓõÄ×Ö½ÚÂ룬Ëü±»StatusManager¸üл·ÈÆ×Å£º¡¡¡¡

¡¡¡¡0: ldc #2; //×Ö·û´®ÏûÏ¢
¡¡¡¡2: invokestatic #3; //·½·¨StatusManager.push:(LString;)V
¡¡¡¡5: invokestatic #4; //·½·¨ doSomething:()V
¡¡¡¡8: invokestatic #5; //·½·¨ StatusManager.pop:()V
¡¡¡¡11: return

¡¡¡¡ÏÂÃæÊÇÏàͬµÄ·½·¨µ÷Ó㬵«ÊÇλÓÚtry-finally´úÂë¿éÖУ¬Òò´Ë£¬Èç¹ûËü²úÉúÁËÒì³£»áµ÷ÓÃStatusManager.pop()£º¡¡¡¡

¡¡¡¡0: ldc #2; //×Ö·û´®ÏûÏ¢
¡¡¡¡2: invokestatic #3; //·½·¨ StatusManager.push:(LString;)V
¡¡¡¡5: invokestatic #4; //·½·¨ doSomething:()V
¡¡¡¡8: invokestatic #5; //·½·¨ StatusManager.pop:()V
¡¡¡¡11: goto 20
¡¡¡¡14: astore_0
¡¡¡¡15: invokestatic #5; //·½·¨ StatusManager.pop:()V
¡¡¡¡18: aload_0
¡¡¡¡19: athrow
¡¡¡¡20: return¡¡¡¡

¡¡¡¡Exception table:
¡¡¡¡from to target type
¡¡¡¡5 8 14 any

¡¡¡¡14 15 14 any

¡¡¡¡Äã¿ÉÒÔ·¢ÏÖ£¬ÎªÁËʵÏÖÒ»¸ötry-finally£¬ÎÒ±ØÐ븴ÖÆһЩָÁ²¢Ìí¼ÓÁ˼¸¸öÌøתºÍÒì³£±í¼Ç¼¡£ÐÒÔ˵ÄÊÇ£¬BCELµÄInstructionListÀàʹÕâÖÖ¹¤×÷Ï൱¼òµ¥¡£

¡¡¡¡ÔÚÔËÐÐʱÖع¹×Ö½ÚÂë

¡¡¡¡ÏÖÔÚÎÒÓµÓÐÁËÒ»¸ö»ùÓÚ×¢½âÐÞ¸ÄÀàµÄ½Ó¿ÚºÍ¸Ã½Ó¿ÚµÄ¾ßÌåʵÏÖÁË£¬ÏÂÒ»²½ÊDZàдµ÷ÓÃËüµÄʵ¼Ê¿ò¼Ü×é¼þ¡£Êµ¼ÊÉÏÎÒ½«±àдÉÙÁ¿µÄ¿ò¼Ü×é¼þ£¬ÏÈ´ÓÔËÐÐʱÖع¹ËùÓÐÀàµÄ¿ò¼Ü×é¼þ¿ªÊ¼¡£ÓÉÓÚÕâÖÖ²Ù×÷»áÔÚbuild¹ý³ÌÖз¢Éú£¬ÎÒ¾ö¶¨ÎªËü¶¨ÒåÒ»¸öAntÊÂÎñ¡£build.xmlÎļþÖеÄÖع¹Ä¿±êµÄÉùÃ÷Ó¦¸ÃÈçÏ£º¡¡¡¡

¡¡¡¡£¼instrument class="com.pkg.OurInstrumentor"£¾
¡¡¡¡£¼fileset dir="$(classes.dir)"£¾
¡¡¡¡£¼include name="**/*.class"/£¾
¡¡¡¡£¼/fileset£¾
¡¡¡¡£¼/instrument£¾

¡¡¡¡ÎªÁËʵÏÖÕâÖÖÊÂÎñ£¬ÎÒ±ØÐ붨ÒåÒ»¸öʵÏÖorg.apache.tools.ant.Task½Ó¿ÚµÄÀà¡£ÎÒÃǵÄÊÂÎñµÄÊôÐÔºÍ×ÓÔªËØ£¨sub-elements£©¶¼ÊÇͨ¹ýsetºÍadd·½·¨µ÷Óô«µÝ½øÀ´µÄ¡£ÎÒÃǵ÷ÓÃÖ´ÐУ¨execute£©·½·¨À´ÊµÏÖÊÂÎñËùÒªÖ´ÐеŤ×÷--ÔÚʾÀýÖУ¬¾ÍÊÇÖع¹£¼fileset£¾ÖÐÖ¸¶¨µÄÀàÎļþ¡£

¡¡¡¡public class InstrumentTask extends Task {
¡¡¡¡¡¡...
¡¡¡¡¡¡public void setClass (String className) { ... }
¡¡¡¡¡¡public void addFileSet (FileSet fileSet) { ... }¡¡¡¡

¡¡¡¡¡¡public void execute () throws BuildException {
¡¡¡¡¡¡¡¡Instrumentor inst = getInstrumentor();
¡¡¡¡try {
¡¡¡¡¡¡¡¡¡¡DirectoryScanner ds =fileSet.getDirectoryScanner(project);
¡¡¡¡¡¡¡¡¡¡// Java 1.5 µÄ"for" Óï·¨
¡¡¡¡¡¡¡¡¡¡for (String file : ds.getIncludedFiles()) {
¡¡¡¡¡¡¡¡¡¡¡¡instrumentFile(inst, file);
¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡} catch (Exception ex) {
¡¡¡¡¡¡¡¡¡¡throw new BuildException(ex);
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡}
¡¡¡¡¡¡...
¡¡¡¡}

¡¡¡¡ÓÃÓÚ¸ÃÏî²Ù×÷µÄBCEL 5.1°æ±¾ÓÐÒ»¸öÎÊÌâ--Ëü²»Ö§³Ö·ÖÎö×¢½â¡£ÎÒ¿ÉÒÔÔØÈëÕýÔÚÖع¹µÄÀಢʹÓ÷´É䣨reflection£©²é¿´×¢½â¡£µ«ÊÇ£¬Èç¹ûÕâÑù£¬ÎҾͲ»µÃ²»Ê¹ÓÃRetentionPolicy.RUNTIMEÀ´´úÌæRetentionPolicy.CLASS¡£ÎÒ»¹±ØÐëÔÚÕâЩÀàÖÐÖ´ÐÐһЩ¾²Ì¬µÄ³õʼ»¯£¬¶øÕâЩ²Ù×÷¿ÉÄÜÔØÈë±¾µØÀà¿â»òÒýÈëÆäËüµÄÒÀÀµ¹Øϵ¡£ÐÒÔ˵ÄÊÇ£¬BCELÌṩÁËÒ»ÖÖ²å¼þ£¨plugin£©»úÖÆ£¬ËüÔÊÐí¿Í»§¶Ë·ÖÎö×Ö½ÚÂëÊôÐÔ¡£ÎÒ±àдÁË×Ô¼ºµÄAttributeReaderµÄʵÏÖ£¨implementation£©£¬ÔÚ³öÏÖ×¢½âµÄʱºò£¬ËüÖªµÀÈçºÎ·ÖÎö²åÈë×Ö½ÚÂëÖеÄRuntimeVisibleAnnotationsºÍRuntimeInvisibleAnnotationsÊôÐÔ¡£BCELδÀ´µÄ°æ±¾Ó¦¸Ã»á°üº¬ÕâÖÖ¹¦Äܶø²»ÊÇ×÷Ϊ²å¼þÌṩ¡£

¡¡¡¡±àÒëʱ¿ÌµÄ×Ö½ÚÂëÖع¹·½·¨ÏÔʾÔÚʾÀý´úÂëµÄcode/02_compiletimeĿ¼ÖС£

¡¡¡¡µ«ÊÇÕâÖÖ·½·¨ÓкܶàȱÏÝ¡£Ê×ÏÈ£¬ÎÒ±ØÐë¸ø½¨Á¢¹ý³ÌÔö¼Ó¶îÍâµÄ²½Öè¡£ÎÒ²»ÄÜ»ùÓÚÃüÁîÐÐÉèÖûòÆäËü±àÒëʱûÓÐÌṩµÄÐÅÏ¢À´¾ö¶¨´ò¿ª»ò¹Ø±ÕÖع¹²Ù×÷¡£Èç¹ûÖع¹µÄ»òûÓÐÖع¹µÄ´úÂëÐèҪͬʱÔÚ²úÆ·»·¾³ÖÐÔËÐУ¬ÄÇô¾Í±ØÐ뽨Á¢Á½¸öµ¥¶ÀµÄ.jarsÎļþ£¬¶øÇÒ»¹±ØÐë¾ö¶¨Ê¹ÓÃÄÄÒ»¸ö¡£

ÔÚÀàÔØÈëʱÖع¹×Ö½ÚÂë

¡¡¡¡¸üºÃµÄ·½·¨¿ÉÄÜÊÇÑÓ³Ù×Ö½ÚÂëÖع¹²Ù×÷£¬Ö±µ½×Ö½ÚÂë±»ÔØÈëµÄʱºò²Å½øÐÐÖع¹¡£Ê¹ÓÃÕâÖÖ·½·¨µÄʱºò£¬Öع¹µÄ×Ö½ÚÂë²»Óñ£´æÆðÀ´¡£ÎÒÃǵÄÓ¦ÓóÌÐòÆô¶¯Ê±¿ÌµÄÐÔÄÜ¿ÉÄÜ»áÊܵ½Ó°Ï죬µ«ÊÇÄãÈ´¿ÉÒÔ»ùÓÚ×Ô¼ºµÄϵͳÊôÐÔ»òÔËÐÐʱÅäÖÃÊý¾ÝÀ´¿ØÖƽøÐÐʲô²Ù×÷¡£

¡¡¡¡Java 1.5֮ǰ£¬ÎÒÃÇʹÓö¨ÖƵÄÀàÔØÈë³ÌÐò¿ÉÄÜʵÏÖÕâÖÖÀàÎļþά»¤²Ù×÷¡£µ«ÊÇJava 1.5ÖÐÐÂÔö¼ÓµÄjava.lang.instrument³ÌÐò°üÌṩÁËÉÙÊý¸½¼ÓµÄ¹¤¾ß¡£ÌرðµØ£¬Ëü¶¨ÒåÁËClassFileTransformerµÄ¸ÅÄÔÚ±ê×¼µÄÔØÈë¹ý³ÌÖÐÎÒÃÇ¿ÉÒÔʹÓÃËüÀ´Öع¹Ò»¸öÀà¡£

¡¡¡¡ÎªÁËÔÚÊʵ±µÄʱºò£¨ÔÚÔØÈëÈκÎÀà֮ǰ£©×¢²áClassFileTransformer£¬ÎÒÐèÒª¶¨ÒåÒ»¸öpremain·½·¨¡£JavaÔÚÔØÈëÖ÷Àࣨmain class£©Ö®Ç°½«µ÷ÓÃÕâ¸ö·½·¨£¬²¢ÇÒËü´«µÝ½øÀ´¶ÔInstrumentation¶ÔÏóµÄÒýÓá£ÎÒ»¹±ØÐë¸øÃüÁîÐÐÔö¼Ó-javaagent²ÎÊýÑ¡Ï¸æËßJavaÎÒÃǵÄpremain·½·¨µÄÐÅÏ¢¡£Õâ¸ö²ÎÊýÑ¡Ïî°ÑÎÒÃǵÄagent class£¨´úÀíÀ࣬Ëü°üº¬ÁËpremain·½·¨£©µÄÈ«ÃûºÍÈÎÒâ×Ö·û´®×÷Ϊ²ÎÊý¡£ÔÚÀý×ÓÖÐÎÒÃÇ°ÑInstrumentorÀàµÄÈ«Ãû×÷Ϊ²ÎÊý£¨Ëü±ØÐëÔÚͬһÐÐÖ®ÖУ©£º

¡¡¡¡-javaagent:boxpeeking.instrument.InstrumentorAdaptor=
¡¡¡¡boxpeeking.status.instrument.StatusInstrumentor

¡¡¡¡ÏÖÔÚÎÒÒѾ­°²ÅÅÁËÒ»¸ö»Øµ÷£¨callback£©£¬ËüÔÚÔØÈëÈκκ¬ÓÐ×¢½âµÄÀà֮ǰ¶¼»á·¢Éú£¬²¢ÇÒÎÒÓµÓÐInstrumentation¶ÔÏóµÄÒýÓ㬿ÉÒÔ×¢²áÎÒÃǵÄClassFileTransformerÁË£º

¡¡¡¡public static void premain (String className,
¡¡¡¡Instrumentation i)
¡¡¡¡throws ClassNotFoundException,
¡¡¡¡InstantiationException,
¡¡¡¡IllegalAccessException
¡¡¡¡{
¡¡¡¡¡¡Class instClass = Class.forName(className);
¡¡¡¡¡¡Instrumentor inst = (Instrumentor)instClass.newInstance();
¡¡¡¡¡¡i.addTransformer(new InstrumentorAdaptor(inst));
¡¡¡¡}

¡¡¡¡ÎÒÃÇÔÚ´Ë´¦×¢²áµÄÊÊÅäÆ÷½«³äµ±ÉÏÃæ¸ø³öµÄInstrumentor½Ó¿ÚºÍJavaµÄClassFileTransformer½Ó¿ÚÖ®¼äµÄÇÅÁº¡£ ¡¡¡¡

¡¡¡¡public class InstrumentorAdaptor
¡¡¡¡implements ClassFileTransformer
¡¡¡¡{
¡¡¡¡¡¡public byte[] transform (ClassLoader cl,String className,Class classBeingRedefined,
¡¡¡¡ProtectionDomain protectionDomain,byte[] classfileBuffer)
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡try {
¡¡¡¡¡¡¡¡¡¡ClassParser cp =new ClassParser(new ByteArrayInputStream(classfileBuffer),className + ".java");
¡¡¡¡¡¡¡¡¡¡JavaClass jc = cp.parse();
¡¡¡¡¡¡ClassGen cg = new ClassGen(jc);
¡¡¡¡¡¡for (Annotation an : getAnnotations(jc.getAttributes())) {
¡¡¡¡¡¡¡¡¡¡¡¡instrumentor.instrumentClass(cg, an);
¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡for (org.apache.bcel.classfile.Method m : cg.getMethods()) {
¡¡¡¡¡¡¡¡¡¡¡¡for (Annotation an : getAnnotations(m.getAttributes())) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ConstantPoolGen cpg =cg.getConstantPool();
¡¡¡¡¡¡¡¡¡¡¡¡¡¡MethodGen mg =new MethodGen(m, className, cpg);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡instrumentor.instrumentMethod(cg, mg, an);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡mg.setMaxStack();
¡¡¡¡¡¡¡¡¡¡¡¡¡¡mg.setMaxLocals();
¡¡¡¡¡¡¡¡¡¡¡¡¡¡cg.replaceMethod(m, mg.getMethod());
¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡¡¡JavaClass jcNew = cg.getJavaClass();
¡¡¡¡¡¡¡¡¡¡return jcNew.getBytes();
¡¡¡¡¡¡¡¡} catch (Exception ex) {
¡¡¡¡¡¡¡¡¡¡throw new RuntimeException("instrumenting " + className, ex);
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡}
¡¡¡¡¡¡...
¡¡¡¡}

¡¡¡¡ÕâÖÖÔÚÆô¶¯Ê±Öع¹×Ö½ÚÂëµÄ·½·¨Î»ÓÚÔÚʾÀýµÄ/code/03_startupĿ¼ÖС£

¡¡¡¡Òì³£µÄ´¦Àí

¡¡¡¡ÎÄÕÂÇ°ÃæÌáµ½£¬ÎÒÏ£Íû±àд¸½¼ÓµÄ´úÂëʹÓò»Í¬Ä¿µÄµÄ@Status×¢½â¡£ÎÒÃÇÀ´¿¼ÂÇÒ»ÏÂһЩ¶îÍâµÄÐèÇó£ºÎÒÃǵÄÓ¦ÓóÌÐò±ØÐ벶׽ËùÓеÄδ´¦ÀíÒì³£²¢°ÑËüÃÇÏÔʾ¸øÓû§¡£µ«ÊÇ£¬ÎÒÃDz»ÊÇÌṩJava¶ÑÕ»¸ú×Ù£¬¶øÊÇÏÔʾӵÓÐ@Status×¢½âµÄ·½·¨£¬¶øÇÒ»¹²»Ó¦¸ÃÏÔʾÈκδúÂ루Àà»ò·½·¨µÄÃû³Æ»òÐкŵȵȣ©¡£

¡¡¡¡ÀýÈ磬¿¼ÂÇÏÂÃæµÄ¶ÑÕ»¸ú×ÙÐÅÏ¢£º

¡¡¡¡java.lang.RuntimeException: Could not load data for symbol IBM
¡¡¡¡at boxpeeking.code.YourCode.loadData(Unknown Source)
¡¡¡¡at boxpeeking.code.YourCode.go(Unknown Source)
¡¡¡¡at boxpeeking.yourcode.ui.Main+2.run(Unknown Source)
¡¡¡¡at java.lang.Thread.run(Thread.java:566)
¡¡¡¡Caused by: java.lang.RuntimeException: Timed out
¡¡¡¡at boxpeeking.code.YourCode.connectToDB(Unknown Source)

¡¡¡¡... ¸ü¶àÐÅÏ¢

¡¡¡¡Õ⽫µ¼ÖÂͼ1ÖÐËùʾµÄGUIµ¯³ö¿ò£¬ÉÏÃæµÄÀý×Ó¼ÙÉèÄãµÄYourCode.loadData()¡¢YourCode.go()ºÍYourCode.connectToDB()¶¼º¬ÓÐ@Status×¢½â¡£Çë×¢Ò⣬Òì³£µÄ´ÎÐòÊÇÏà·´µÄ£¬Òò´ËÓû§×îÏȵõ½µÄÊÇ×îÏêϸµÄÐÅÏ¢¡£
ΪÁËʵÏÖÕâЩ¹¦ÄÜ£¬ÎÒ±ØÐë¶ÔÒÑÓеĴúÂë½øÐÐÉÔ΢µÄÐ޸ġ£Ê×ÏÈ£¬ÎªÁËÈ·±£ÔÚÔËÐÐʱ@Status×¢½âÊÇ¿ÉÒÔ¿´µ½µÄ£¬ÎҾͱØÐëÔٴθüÐÂ@Retention£¬°ÑËüÉèÖÃΪ@Retention(RetentionPolicy.RUNTIME)¡£Çë¼Çס£¬@Retention¿ØÖÆ×ÅJVMʲôʱºòÅ×Æú×¢½âÐÅÏ¢¡£ÕâÑùµÄÉèÖÃÒâζ×Å×¢½â²»½ö¿ÉÒÔ±»±àÒëÆ÷²åÈë×Ö½ÚÂëÖУ¬»¹Äܹ»Ê¹ÓÃеÄMethod.getAnnotation(Class)·½·¨Í¨¹ý·´ÉäÀ´½øÐзÃÎÊ¡£

¡¡¡¡ÏÖÔÚÎÒÐèÒª°²ÅŽÓÊÕ´úÂëÖÐûÓÐÃ÷È·´¦ÀíµÄÈκÎÒì³£µÄ֪ͨÁË¡£ÔÚJava 1.4ÖУ¬´¦ÀíÈκÎÌض¨Ïß³ÌÉÏδ´¦ÀíÒì³£µÄ×îºÃ·½·¨ÊÇʹÓÃThreadGroup×ÓÀಢ¸ø¸ÃÀàÐ͵ÄThreadGroupÌí¼Ó×Ô¼ºµÄÐÂÏ̡߳£µ«ÊÇJava 1.5ÌṩÁ˶îÍâµÄ¹¦ÄÜ¡£ÎÒ¿ÉÒÔ¶¨ÒåUncaughtExceptionHandler½Ó¿ÚµÄÒ»¸öʵÀý£¬²¢ÎªÈκÎÌض¨µÄỊ̈߳¨»òËùÓÐỊ̈߳©×¢²áËü¡£

¡¡¡¡Çë×¢Ò⣬ÔÚÀý×ÓÖÐΪÌض¨Òì³£×¢²á¿ÉÄܸüºÃ£¬µ«ÊÇÔÚJava 1.5.0beta1£¨#4986764£©ÖÐÓÐÒ»¸öbug£¬ËüʹÕâÑù²Ù×÷ÎÞ·¨½øÐС£µ«ÊÇΪËùÓÐÏß³ÌÉèÖÃÒ»¸ö´¦Àí³ÌÐòÊÇ¿ÉÒÔ¹¤×÷µÄ£¬Òò´ËÎÒ¾ÍÕâÑù²Ù×÷ÁË¡£

¡¡¡¡ÏÖÔÚÎÒÃÇÓµÓÐÁËÒ»ÖÖ½Øȡδ´¦ÀíÒì³£µÄ·½·¨ÁË£¬²¢ÇÒÕâЩÒì³£±ØÐë±»±¨¸æ¸øÓû§¡£ÔÚGUIÓ¦ÓóÌÐòÖУ¬µäÐÍÇé¿öÏÂÕâÑùµÄ²Ù×÷ÊÇͨ¹ýµ¯³öÒ»¸ö°üº¬Õû¸ö¶ÑÕ»¸ú×ÙÐÅÏ¢»ò¼òµ¥ÏûÏ¢µÄģʽ¶Ô»°¿òÀ´ÊµÏֵġ£ÔÚÀý×ÓÖУ¬ÎÒÏ£ÍûÔÚ²úÉúÒì³£µÄʱºòÏÔʾһ¸öÏûÏ¢£¬µ«ÊÇÎÒÏ£ÍûÌṩ¶ÑÕ»µÄ@StatusÃèÊö¶ø²»ÊÇÀàºÍ·½·¨µÄÃû³Æ¡£ÎªÁËʵÏÖÕâ¸öÄ¿µÄ£¬ÎÒ¼òµ¥µØÔÚThreadµÄStackTraceElementÊý×éÖвéѯ£¬ÕÒµ½Óëÿ¸ö¿ò¼ÜÏà¹ØµÄjava.lang.reflect.Method¶ÔÏ󣬲¢²éѯËüµÄ¶ÑÕ»×¢½âÁÐ±í¡£²»ÐÒµÄÊÇ£¬ËüÖ»ÌṩÁË·½·¨µÄÃû³Æ£¬Ã»ÓÐÌṩ·½·¨µÄÌØÕ÷Á¿£¨signature£©£¬Òò´ËÕâÖÖ¼¼Êõ²»Ö§³ÖÃû³ÆÏàͬµÄ£¨µ«@Status×¢½â²»Í¬µÄ£©ÖØÔØ·½·¨¡£

¡¡¡¡ÊµÏÖÕâÖÖ·½·¨µÄʾÀý´úÂë¿ÉÒÔÔÚpeekinginside-pt2.tar.gzÎļþµÄ/code/04_exceptionsĿ¼ÖÐÕÒµ½¡£

È¡Ñù£¨Sampling£©

¡¡¡¡ÎÒÏÖÔÚÓа취°ÑStackTraceElementÊý×éת»»Îª@Status×¢½â¶ÑÕ»¡£ÕâÖÖ²Ù×÷±È±íÃ÷¿´µ½µÄ¸ü¼ÓÓÐÓá£Java 1.5ÖеÄÁíÒ»¸öÐÂÌØÐÔ--Ï̷߳´Ê¡£¨introspection£©--ʹÎÒÃÇÄܹ»´Óµ±Ç°ÕýÔÚÔËÐеÄÏß³ÌÖеõ½×¼È·µÄStackTraceElementÊý×é¡£ÓÐÁËÕâÁ½²¿·ÖÐÅÏ¢Ö®ºó£¬ÎÒÃǾͿÉÒÔ¹¹ÔìJstatusBarµÄÁíÒ»ÖÖʵÏÖ¡£StatusManager½«²»»áÔÚ·¢Éú·½·¨µ÷ÓõÄʱºò½ÓÊÕ֪ͨ£¬¶øÊǼòµ¥µØÆô¶¯Ò»¸ö¸½¼ÓµÄỊ̈߳¬ÈÃËü¸ºÔðÔÚÕý³£µÄ¼ä¸ôÆÚ¼äץȡ¶ÑÕ»¸ú×ÙÐÅÏ¢ºÍÿ¸ö²½ÖèµÄ״̬¡£Ö»ÒªÕâ¸ö¼ä¸ôÆÚ¼ä×ã¹»¶Ì£¬Óû§¾Í²»»á¸Ð¾õµ½¸üеÄÑÓ³Ù¡£

¡¡¡¡ÏÂÃæʹ"sampler"Ï̱߳³ºóµÄ´úÂ룬Ëü¸ú×ÙÁíÒ»¸öÏ̵߳ľ­¹ý£º

¡¡¡¡class StatusSampler implements Runnable
¡¡¡¡{
¡¡¡¡¡¡private Thread watchThread;¡¡¡¡

¡¡¡¡¡¡public StatusSampler (Thread watchThread)
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡this.watchThread = watchThread;
¡¡¡¡¡¡}¡¡¡¡

¡¡¡¡¡¡public void run ()
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡while (watchThread.isAlive()) {
¡¡¡¡¡¡¡¡¡¡// ´ÓÏß³ÌÖеõ½¶ÑÕ»¸ú×ÙÐÅÏ¢
¡¡¡¡¡¡¡¡¡¡StackTraceElement[] stackTrace =watchThread.getStackTrace();
¡¡¡¡¡¡¡¡¡¡// ´Ó¶ÑÕ»¸ú×ÙÐÅÏ¢ÖÐÌáȡ״̬ÏûÏ¢
¡¡¡¡¡¡¡¡¡¡List£¼Status£¾ statusList =StatusFinder.getStatus(stackTrace);
¡¡¡¡¡¡¡¡¡¡Collections.reverse(statusList);
¡¡¡¡¡¡¡¡¡¡// ÓÃ״̬ÏûÏ¢½¨Á¢Ä³ÖÖ״̬
¡¡¡¡¡¡¡¡¡¡StatusState state = new StatusState();
¡¡¡¡¡¡¡¡¡¡for (Status s : statusList) {
¡¡¡¡¡¡¡¡¡¡¡¡String message = s.value();
¡¡¡¡¡¡¡¡¡¡¡¡state.push(message);
¡¡¡¡¡¡¡¡¡¡}

¡¡¡¡¡¡// ¸üе±Ç°µÄ״̬

¡¡¡¡¡¡¡¡¡¡StatusManager.setState(watchThread,state);

¡¡¡¡¡¡¡¡¡¡//ÐÝÃßµ½ÏÂÒ»¸öÖÜÆÚ

¡¡¡¡¡¡¡¡¡¡try {
¡¡¡¡¡¡¡¡¡¡¡¡Thread¡¡.sleep(SAMPLING_DELAY);
¡¡¡¡¡¡¡¡¡¡} catch (InterruptedException ex) {}
¡¡¡¡¡¡¡¡}
¡¡¡¡//״̬¸´Î»
¡¡¡¡¡¡¡¡StatusManager.setState(watchThread,new StatusState());
¡¡¡¡¡¡}
¡¡¡¡}

¡¡¡¡ÓëÔö¼Ó·½·¨µ÷Óá¢ÊÖ¶¯»òͨ¹ýÖع¹Ïà±È£¬È¡Ñù¶Ô³ÌÐòµÄÇÖº¦ÐÔ£¨invasive£©¸üС¡£ÎÒ¸ù±¾²»ÐèÒª¸Ä±ä½¨Á¢¹ý³Ì»òÃüÁîÐвÎÊý£¬»òÐÞ¸ÄÆô¶¯¹ý³Ì¡£ËüÒ²ÔÊÐíÎÒͨ¹ýµ÷ÕûSAMPLING_DELAYÀ´¿ØÖÆÕ¼ÓõĿªÏú¡£²»ÐÒµÄÊÇ£¬µ±·½·¨µ÷ÓÿªÊ¼»ò½áÊøµÄʱºò£¬ÕâÖÖ·½·¨Ã»ÓÐÃ÷È·µÄ»Øµ÷¡£³ýÁË״̬¸üеÄÑÓ³ÙÖ®Í⣬ûÓÐÔ­ÒòÒªÇóÕâ¶Î´úÂëÔÚÄǸöʱºò½ÓÊջص÷¡£µ«ÊÇ£¬Î´À´ÎÒÄܹ»Ôö¼ÓһЩ¶îÍâµÄ´úÂëÀ´¸ú×Ùÿ¸ö·½·¨µÄ׼ȷµÄÔËÐÐʱ¡£Í¨¹ý¼ì²éStackTraceElementÊÇ¿ÉÒÔ¾«È·µØʵÏÖÕâÑùµÄ²Ù×÷µÄ¡£

¡¡¡¡Í¨¹ýÏß³ÌÈ¡ÑùʵÏÖJStatusBarµÄ´úÂë¿ÉÒÔÔÚpeekinginside-pt2.tar.gzÎļþµÄ/code/05_samplingĿ¼ÖÐÕÒµ½¡£

¡¡¡¡ÔÚÖ´Ðйý³ÌÖÐÖع¹×Ö½ÚÂë

¡¡¡¡Í¨¹ý°ÑÈ¡ÑùµÄ·½·¨ÓëÖع¹×éºÏÔÚÒ»Æð£¬ÎÒÄܹ»ÐγÉÒ»ÖÖ×îÖÕµÄʵÏÖ£¬ËüÌṩÁ˸÷ÖÖ·½·¨µÄ×î¼ÑÌØÐÔ¡£Ä¬ÈÏÇé¿öÏ¿ÉÒÔʹÓÃÈ¡Ñù£¬µ«ÊÇÓ¦ÓóÌÐòµÄ»¨·Ñʱ¼ä×î¶àµÄ·½·¨¿ÉÒÔ±»¸ö±ðµØ½øÐÐÖع¹¡£ÕâÖÖʵÏÖ¸ù±¾²»»á°²×°ClassTransformer£¬µ«ÊÇ×÷Ϊ´úÌ棬Ëü»áÒ»´ÎÒ»¸öµØÖع¹·½·¨ÒÔÏìӦȡÑù¹ý³ÌÖÐÊÕ¼¯µ½µÄÊý¾Ý¡£

¡¡¡¡ÎªÁËʵÏÖÕâÖÖ¹¦ÄÜ£¬ÎÒ½«½¨Á¢Ò»¸öÐÂÀàInstrumentationManager£¬Ëü¿ÉÒÔÓÃÓÚÖع¹ºÍ²»Öع¹¶ÀÁ¢µÄ·½·¨¡£Ëü¿ÉÒÔʹÓÃеÄInstrumentation.redefineClasses·½·¨À´Ð޸ĿÕÏеÄÀ࣬ͬʱ´úÂëÔò¿ÉÒÔ²»¼ä¶ÏÖ´ÐС£Ç°Ã沿·ÖÖÐÔö¼ÓµÄStatusSamplerÏß³ÌÏÖÔÚÓÐÁ˶îÍâµÄÖ°Ôð£¬Ëü°ÑÈκÎ×Ô¼º"·¢ÏÖ"µÄ@Status·½·¨Ìí¼Óµ½¼¯ºÏÖС£Ëü½«ÖÜÆÚÐÔµØÕÒ³ö×µÄð·¸Õß²¢°ÑËüÃÇÌṩ¸øInstrumentationManagerÒÔ¹©Öع¹¡£ÕâÔÊÐíÓ¦ÓóÌÐò¸ü¼Ó¾«È·µØ¸ú×Ùÿ¸ö·½·¨µÄÆô¶¯ºÍÖÕֹʱ¿Ì¡£

¡¡¡¡Ç°ÃæÌáµ½µÄÈ¡Ñù·½·¨µÄÒ»¸öÎÊÌâÊÇËü²»ÄÜÇø·Ö³¤Ê±¼äÔËÐеķ½·¨ÓëÔÚÑ­»·Öжà´Îµ÷Óõķ½·¨¡£ÓÉÓÚÖع¹»á¸øÿ´Î·½·¨µ÷ÓÃÔö¼ÓÒ»¶¨µÄ¿ªÏú£¬ÎÒÃÇÓбØÒªºöÂÔƵ·±µ÷Óõķ½·¨¡£ÐÒÔ˵ÄÊÇ£¬ÎÒÃÇ¿ÉÒÔʹÓÃÖع¹½â¾öÕâ¸öÎÊÌâ¡£³ýÁ˼òµ¥µØ¸üÐÂStatusManagerÖ®Í⣬ÎÒÃǽ«Î¬»¤Ã¿¸öÖع¹µÄ·½·¨±»µ÷ÓõĴÎÊý¡£Èç¹ûÕâ¸öÊýÖµ³¬¹ýÁËij¸ö¼«ÏÞ£¨Òâζ×Åά»¤Õâ¸ö·½·¨µÄÐÅÏ¢µÄ¿ªÏúÌ«´óÁË£©£¬È¡ÑùÏ߳̽«»áÓÀÔ¶µØÈ¡Ïû¶Ô¸Ã·½·¨µÄÖع¹¡£

¡¡¡¡ÀíÏëÇé¿öÏ£¬ÎÒ½«°Ñÿ¸ö·½·¨µÄµ÷ÓÃÊýÁ¿´æ´¢ÔÚÖع¹¹ý³ÌÖÐÌí¼Óµ½ÀàµÄÐÂ×Ö¶ÎÖС£²»ÐÒµÄÊÇ£¬Java 1.5ÖÐÔö¼ÓµÄÀàת»»»úÖƲ»ÔÊÐíÕâÑù²Ù×÷£»Ëü²»ÄÜÔö¼Ó»òɾ³ýÈκÎ×ֶΡ£×÷Ϊ´úÌ棬ÎÒ½«°ÑÕâЩÐÅÏ¢´æ´¢ÔÚеÄCallCounterÀàµÄMethod¶ÔÏóµÄ¾²Ì¬Ó³ÉäÖС£

¡¡¡¡ÕâÖÖ»ìºÏµÄ·½·¨¿ÉÒÔÔÚʾÀý´úÂëµÄ/code/06_dynamicĿ¼ÖÐÕÒµ½¡£

¡¡¡¡¸ÅÀ¨

¡¡¡¡Í¼4ÌṩÁËÒ»¸ö¾ØÐΣ¬ËüÏÔʾÁËÎÒ¸ø³öµÄÀý×ÓÏà¹ØµÄÌØÐԺʹú¼Û¡£ ¡¡¡¡
http://www.it.com.cn/f/edu/052/21/050216.jpg
Äã¿ÉÒÔ·¢ÏÖ£¬¶¯Ì¬µÄ£¨Dynamic£©·½·¨ÊǸ÷ÖÖ·½°¸µÄÁ¼ºÃ×éºÏ¡£ÓëʹÓÃÖع¹µÄËùÓÐʾÀýÀàËÆ£¬ËüÌṩÁË·½·¨¿ªÊ¼»òÖÕֹʱ¿ÌµÄÃ÷È·µÄ»Øµ÷£¬Òò´ËÄãµÄÓ¦ÓóÌÐò¿ÉÒÔ׼ȷµØ¸ú×ÙÔËÐÐʱ²¢Á¢¼´ÎªÓû§Ìṩ·´À¡ÐÅÏ¢¡£µ«ÊÇ£¬Ëü»¹Äܹ»È¡ÏûijÖÖ·½·¨µÄÖع¹£¨Ëü±»¹ýÓÚƵ·±µØµ÷Óã©£¬Òò´ËËü²»»áÊܵ½ÆäËüµÄÖع¹·½°¸Óöµ½µÄÐÔÄÜÎÊÌâµÄÓ°Ïì¡£ËüûÓаüº¬±àÒëʱ²½Ö裬²¢ÇÒËüûÓÐÔö¼ÓÀàÔØÈë¹ý³ÌÖеĶîÍâµÄ¹¤×÷¡£

¡¡¡¡Î´À´µÄÇ÷ÊÆ

¡¡¡¡ÎÒÃÇ¿ÉÒÔ¸øÕâ¸öÏîÄ¿Ôö¼Ó´óÁ¿µÄ¸½¼þÌØÐÔ£¬Ê¹Ëü¸ü¼ÓÊÊÓá£ÆäÖÐ×îÓÐÓõÄÌØÐÔ¿ÉÄÜÊǶ¯Ì¬µÄ״̬ÐÅÏ¢¡£ÎÒÃÇ¿ÉÒÔʹÓÃеÄjava.util.FormatterÀà°ÑÀàËÆprintfµÄģʽÌæ»»£¨pattern substitution£©ÓÃÓÚ@StatusÏûÏ¢ÖС£ÀýÈ磬ÎÒÃǵÄconnectToDB(String url)·½·¨ÖеÄ@Status("Connecting to %s")×¢½â¿ÉÒÔ°ÑURL×÷ΪÏûÏ¢µÄÒ»²¿·Ö±¨¸æ¸øÓû§¡£

¡¡¡¡ÔÚÔ´´úÂëÖع¹µÄ°ïÖúÏ£¬Õâ¿ÉÄÜÏÔµÃ΢²»×ãµÀ£¬ÒòΪÎÒ½«Ê¹ÓõÄFormatter.format·½·¨Ê¹ÓÃÁ˿ɱä²ÎÊý£¨Java 1.5ÖÐÔö¼ÓµÄ"ħÊõ"¹¦ÄÜ£©¡£Öع¹¹ýµÄ°æ±¾ÀàËÆÏÂÃæµÄÇéÐΣº

¡¡¡¡public void connectToDB (String url) {
¡¡¡¡¡¡Formatter f = new Formatter();
¡¡¡¡¡¡String message = f.format("Connecting to %s", url);¡¡¡¡

¡¡¡¡¡¡StatusManager.push(message);
¡¡¡¡¡¡try {
¡¡¡¡¡¡¡¡...
¡¡¡¡¡¡} finally {
¡¡¡¡¡¡¡¡StatusManager.pop();
¡¡¡¡¡¡}
¡¡¡¡}

¡¡¡¡²»ÐÒµÄÊÇ£¬ÕâÖÖ"ħÊõ"¹¦ÄÜÊÇÍêÈ«ÔÚ±àÒëÆ÷ÖÐʵÏֵġ£ÔÚ×Ö½ÚÂëÖУ¬Formatter.format°ÑObject[]×÷Ϊ²ÎÊý£¬±àÒëÆ÷Ã÷È·µØÌí¼Ó´úÂëÀ´°üװÿ¸öԭʼµÄÀàÐͲ¢×°Åä¸ÃÊý×é¡£Èç¹ûBCELûÓмӽôÃÖ²¹£¬¶øÎÒÓÖÐèҪʹÓÃ×Ö½ÚÂëÖع¹£¬ÎÒ½«²»µÃ²»ÖØÐÂʵÏÖÕâÖÖÂß¼­¡£

¡¡¡¡ÓÉÓÚËüÖ»ÄÜÓÃÓÚÖع¹£¨ÕâÖÖÇé¿öÏ·½·¨²ÎÊýÊÇ¿ÉÓõģ©¶ø²»ÄÜÓÃÓÚÈ¡Ñù£¬Äã¿ÉÄÜÏ£ÍûÔÚÆô¶¯µÄʱºòÖع¹ÕâЩ·½·¨£¬»ò×îÉÙʹ¶¯Ì¬ÊµÏÖÆ«ÏòÓÚÈκη½·¨µÄÖع¹£¬»¹¿ÉÒÔÔÚÏûÏ¢ÖÐʹÓÃÌæ´úģʽ¡£

¡¡¡¡Ä㻹¿ÉÒÔ¸ú×Ùÿ¸öÖع¹µÄ·½·¨µ÷ÓõÄÆô¶¯´ÎÊý£¬Òò´ËÄ㻹¿ÉÒÔ¸ü¼Ó¾«È·µØ±¨¸æÿ¸ö·½·¨µÄÔËÐдÎÊý¡£ÄãÉõÖÁÓÚ¿ÉÒÔ±£´æÕâЩ´ÎÊýµÄÀúʷͳ¼ÆÊý¾Ý£¬²¢Ê¹ÓÃËüÃÇÐγÉÒ»¸öÕæÕýµÄ½ø¶ÈÌõ£¨´úÌæÎÒʹÓõIJ»È·¶¨µÄ°æ±¾£©¡£ÕâÖÖÄÜÁ¦½«¸³ÓèÄãÔÚÔËÐÐʱÖع¹Ä³ÖÖ·½·¨µÄÒ»¸öºÜºÃµÄÀíÓÉ£¬ÒòΪ¸ú×ÙÈκζÀÁ¢µÄ·½·¨µÄ¿ªÏú¶¼ÊǺÜÄܺÜÃ÷ÏԵġ£

¡¡¡¡Äã¿ÉÒÔ¸ø½ø¶ÈÌõÔö¼Ó"µ÷ÊÔ"ģʽ£¬Ëü²»¹Ü·½·¨µ÷ÓÃÊÇ·ñ°üº¬@Status×¢½â£¬±¨¸æÈ¡Ñù¹ý³ÌÖгöÏÖµÄËùÓз½·¨µ÷Óá£Õâ¶ÔÓÚÈκÎÏ£Íûµ÷ÊÔËÀËø»òÐÔÄÜÎÊÌâµÄ¿ª·¢ÕßÀ´Ëµ¶¼ÊÇÎÞ¼ÛÖ®±¦¡£Êµ¼ÊÉÏ£¬Java 1.5»¹ÎªËÀËø£¨deadlock£©¼ì²âÌṩÁËÒ»¸ö¿É±à³ÌµÄAPI£¬ÔÚÓ¦ÓóÌÐòËøסµÄʱºò£¬ÎÒÃÇ¿ÉÒÔʹÓøÃAPI°Ñ½ø³ÌÌõ±ä³ÉºìÉ«¡£

¡¡¡¡±¾ÎÄÖн¨Á¢µÄ»ùÓÚ×¢½âµÄÖع¹¿ò¼Ü×é¼þ¿ÉÄܺÜÓÐÊг¡¡£Ò»¸öÔÊÐí×Ö½ÚÂëÔÚ±àÒëʱ£¨Í¨¹ýAntÊÂÎñ£©¡¢Æô

¡¡¡¡¶¯Ê±£¨Ê¹ÓÃClassTransformer£©ºÍÖ´Ðйý³ÌÖУ¨Ê¹ÓÃInstrumentation£©½øÐÐÖع¹µÄ¹¤¾ß¶ÔÓÚÉÙÁ¿ÆäËüÐÂÏîÄ¿À´ËµºÁÎÞÒÉÎʵطdz£ÓмÛÖµ¡£

¡¡¡¡×ܽá

¡¡¡¡ÔÚÕ⼸¸öÀý×ÓÖÐÄã¿ÉÒÔ¿´µ½£¬ÔªÊý¾Ý±à³Ì£¨meta-programming£©¿ÉÄÜÊÇÒ»Öַdz£Ç¿´óµÄ¼¼Êõ¡£±¨¸æ³¤Ê±¼äÔËÐеIJÙ×÷µÄ½ø³Ì½ö½öÊÇÕâÖÖ¼¼ÊõµÄÓ¦ÓÃÖ®Ò»£¬¶øÎÒÃǵÄJStatusBar½ö½öÊǹµÍ¨ÕâЩÐÅÏ¢µÄÒ»ÖÖý½é¡£ÎÒÃÇ¿ÉÒÔ¿´µ½£¬Java 1.5ÖÐÌṩµÄºÜ¶àÐÂÌØÐÔΪԪÊý¾Ý±à³ÌÌṩÁËÔöÇ¿µÄÖ§³Ö¡£ÌرðµØ£¬°Ñ×¢½âºÍÔËÐÐʱÖع¹×éºÏÔÚÒ»ÆðΪÃæÏòÊôÐԵıà³ÌÌṩÁËÕæÕý¶¯Ì¬µÄÐÎʽ¡£ÎÒÃÇ¿ÉÒÔ½øÒ»²½Ê¹ÓÃÕâЩ¼¼Êõ£¬Ê¹ËüµÄ¹¦Äܳ¬Ô½ÒÑÓеĿò¼Ü×é¼þ£¨ÀýÈçXDocletÌṩµÄ¿ò¼Ü×é¼þµÄ¹¦ÄÜ£©¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ