¡¡¡¡Åú×¢Äܹ»Ïû³ýÑù°å´úÂ룬ÈÃÔ´´úÂëµÄ¿É¶ÁÐÔ¸ü¸ß£¬²¢ÄÜÌṩ¼¶±ð¸ü¸ßµÄ´íÎó¼ì²é¡£´ÓEJB3µ½JUnit4£¬ÄÄÀﶼÔÚʹÓÃËü¡£±¾Îľͽ«¸æËßÄãÈçºÎʹÓÃËü¡£
¡¡¡¡Java 5ÏòJavaÒýÈëÁËÅú×¢(Annotations)£¬ËüµÄʹÓÃѸËÙ³ÉΪÏÖ´úJava¿ª·¢Öв»¿ÉȱÉÙµÄÒ»²¿·Ö¡£ÔÚÕýʽ¿ªÊ¼½éÉÜËü֮ǰ£¬¿´¿´ÎªÊ²Ã´Òª·¢Ã÷Åú×¢£¬ÕâÊǷdz£ÖµµÃµÄ¡£
¡¡¡¡×Ô´ÓJavaµ®ÉúÖ®ÈÕÆð£¬ÈËÃǾÍÒ»Ö±ÔÚ½â¾öËü³õÆÚºöÊÓÁ˵ÄһЩÎÊÌ⣺ȱÉÙÔªÊý¾Ý£»È±·¦½«JavaÒÔÍâµÄ´úÂëǶÈëµ½JavaÔ´´úÂëÎļþÀïµÄÄÜÁ¦µÈ¡£µ±JavaÃæÊеÄʱºò£¬Õë¶ÔÕâЩÎÊÌâ¶øÍƳöµÄJavaDocÖÕÓÚÈÃËü±äÍêÕûÁË¡£JavaDocʹÓÃÁËÔÚ´úÂëÀïרÃűê¼Ç×¢Ê͵ĸÅÄ´Ó¶øÈÃËüÄܹ»ÌáÈ¡³ö¶îÍâµÄÐÅÏ¢£¬Ëµ¾ßÌåµã¾ÍÊÇÎĵµ£¬²¢½«Ëüת»»³ÉΪÎÒÃÇÊìϤµÄJavaDocÎĵµ¡£ÕâÊÇÒ»Ïî¼òµ¥µÄ¼¼Êõ£¬ÈËÈ˶¼¿ÉÒÔʹÓá£Ê×ÏÈ»áÓÐDoclet£¬Ä¿µÄÊÇÈÃÈËÃÇÀ©Õ¹ÎĵµµÄÊä³ö¡£È»ºóÊÇXdoclet£¬ËüÏñʹÓñê¼ÇÒ»ÑùʹÓÃJavaDocÀ´Éú³É´úÂ룬´Ó¶ø½«Õû¸ö¹ý³Ì±äµÃÇá¶øÒ×¾Ù¡£Õⲿ·ÖÊǶÔJ2EEµÄ¸´ÔÓÐԵĻØÓ¦¡£J2EEÔÀ´ÒÀ¿¿ºÜ¶àÑù°å´úÂë(boilerplate code)°Ñ¶ÔÏóÀ¦°óµ½J2EE¿ò¼ÜÀï¡£µ«ÊÇÕâЩ·½°¸¶¼ÓÐһЩÎÊÌâ¡£Ê×ÏÈ£¬×¢ÊÍÀïµÄ±ê¼Ç´ÓÀ´¶¼²»»á½øÈë×îÖÕµÄÔ´´úÂ룬ËùÒÔ³ý·ÇÄãÉú³É´úÂëÀ´·´Ó³ÕâЩ±ê¼Ç£¬·ñÔòÄãÎÞ·¨ÔÚÔËÐÐÆÚ¼ä²éÕÒµ½Ëü¡£Æä´Î£¬Ëü»á°ÑÕû¸öÔ¤´¦Àí²ã¼Óµ½(ÔÚÀíÏëÇé¿öÏÂÓ¦¸ÃÊÇ)Ò»¸ö¼òµ¥±àÒë¹ý³ÌÀï¡£×îºó£¬»ùÓÚ×¢Ê͵ıê¼ÇÔÚ±àÒëÆڼ䲢²»ÊǺÜÈÝÒ×¼ì²é£¬Ò²ÎÞ·¨ÇáÒ×±»ºÜ¶àIDE¼ì²é£»Èç¹ûÄã°Ñ×¢Êͱê¼Çƴд´íÁË£¬±àÒëÆ÷ÊDz»»á×¢Òâµ½µÄ£¬±àÒëÆ÷Ö»»á¹Ø×¢ÄÇЩËüÖªµÀÈ·ÇÐÃû×ֵıê¼Ç¡£
¡¡¡¡Òª½â¾öÕâËùÓеÄÎÊÌ⣬JavaÐÂÔöÁËÅú×¢¡£Åú×¢ÊÇÓÃÓÚJavaÓïÑԵı¾»úÔªÊý¾Ý±ê¼Ç¡£ËüÃǵÄÊäÈëÑϸñÓëJavaÓïÑÔµÄÆäËû²¿·ÖÀàËÆ£¬¿ÉÒÔͨ¹ý·´Ó³±»·¢ÏÖ£¬¸üÈÝÒ×µØÈÃIDEºÍ±àÒëÆ÷µÄ±àдÕß¹ÜÀí¡£ÏÖÔÚ¾ÍÈÃÎÒÃÇ¿´Ò»Ð©±»Åú×¢µÄ´úÂë°É£»ÎÒÃÇÏÈ´ÓBaseExample¿ªÊ¼£¬ËüÊÇÒ»¸ö¼òµ¥Àֻ࣬´øÓÐÒ»¸ö·½·¨----myMethod£º
¡¡¡¡public class BaseExample {
¡¡¡¡public BaseExample() {}
¡¡¡¡public void myMethod() {
¡¡¡¡System.out.println("This is the BaseExample");
¡¡¡¡}
¡¡¡¡}
¡¡¡¡ÏÖÔÚ£¬ÎÒÃÇÏëÒªÀ©Õ¹BaseExample²¢Ìæ´úmyMethod¡£ÏÂÃæ¾ÍÊÇÍê³ÉÕâÒ»ÈÎÎñµÄExample1´úÂ룺
¡¡¡¡public class Example1 extends BaseExample {
¡¡¡¡public Example1() {}
¡¡¡¡@Overridepublic void myMethod() {
¡¡¡¡System.out.println("This is the Example1");
¡¡¡¡}
¡¡¡¡}
¡¡¡¡ÕâÑùÎÒÃǾÍÓÐÁ˵ÚÒ»¸ö¹ØÓÚmyMethodµÄÅú×¢----@Override¡£ÕâÊÇһϵÁÐÄÚÖõÄÅú×¢Ö®Ò»¡£@OverrideµÄÒâ˼ÊÇ¡°·½·¨±ØÐëÌæ´úÆ䳬ÀàÖеÄÒ»¸ö·½·¨£»Èç¹û×ö²»µ½ÕâÒ»µã£¬ÄÇô¾Í»áÓж«Î÷³ö´í£¬Ê¹µÃ±àÒëÆ÷²úÉú´íÎ󡱡£Ã»ÓÐ@Override£¬´úÂëÕÕÑù»áÕý³£¹¤×÷£¬µ«ÊǼÙÉèÓÐÈËÐÞ¸ÄBaseExample£¬ÈÃmyMethod´øÓвÎÊý¡£Èç¹ûÄãûÓÐʹÓÃ@OverrideÅú×¢£¬´úÂëÈÔÈ»»á±»±àÒ룬Òþ²ØÁË×ÓÀàûÓÐÌæ´ú³¬Àà·½·¨µÄÎÊÌâ¡£Èç¹ûÓÐ@OverrideµÄ»°£¬Äã»áÔÚ±àÒëÆڼ俴µ½·¢Éú´íÎó¡£
¡¡¡¡Äã¿ÉÄÜ»áÈÏΪ¡°ÄѵÀÓïÑÔµÄÀ©Õ¹Ã»Óнâ¾öÕâ¸öÎÊÌ⣬¶îÍâµÄ¹Ø¼ü×Ö¿ÉÄÜ»áÂ𡱣¬Êǵģ¬Ëü¿ÉÄÜÒѾʵÏÖÁËÕâÒ»µã£¬µ«ÊÇÕâ²»½öûÓиøÓïÑÔ´øÀ´ÈκÎÁé»îÐÔ£¬»¹»áµ¼ÖºܶàÔ´´úÂë¼æÈÝÐÔµÄÎÊÌâ¡£Åú×¢ÕâÖÖ·½Ê½±ÜÃâÁ˸ıäJavaÓïÑÔ±¾Éí(µ±È»³ýÁËÔö¼ÓÁË@markup)£¬²¢ÇÒ»¹Äܹ»·ÅÔÚ´úÂëµÄ²»Í¬²¿·ÖÀ¶ø²»½ö½öÊÇÔÚ±ê¼Ç·½·¨Àï¡£
¡¡¡¡¹ØÓÚÅú×¢»¹ÓÐÒ»µãÊÇ£¬Äã¿ÉÒÔ´´½¨×Ô¼ºµÄÅú×¢±ê¼Ç£¬ÕâÕýÊÇÎÒÃÇÂíÉÏÒªÌÖÂÛµÄÄÚÈÝ¡£ÏëÒ»ÏëÏÂÃæÕâ¸öÎÊÌ⣺ÎÒÃÇÓÐһЩ¼òµ¥µÄJava Beans³ÌÐò£¬ËüÃǶ¼´øÓв»Í¬µÄ×Ö·û´®×ֶΡ£ÎÒÃÇÏ£ÍûÄܹ»ÓÐһЩͨÓô°ÌåÏÔʾ´úÂ룬ËüÃÇÄܹ»ÓÃÆäËûÏÔʾÌáʾ(±ÈÈç¿í¶È)À´ÕýÈ·µØ±êʾÕâЩ×ֶΡ£ÏÖÔÚÎÒÃÇ¿ÉÒÔ±àдһ¸ö³¬À࣬ËüÄܹ»ÌáÈ¡³öÕâ¸öÊý¾Ý£¬±ÈÈç˵´ÓÒ»¸öÔÚÿ¸öÀàÀﶼ´øÓÐһЩ¾²Ì¬Ö§³Ö·½·¨µÄ¾²Ì¬Êý×éÀµ«ÊÇÕâÒ²Òâζ×ÅҪǿÖƸø´úÂë·Ö²ã¡£ÀûÓÃÅú×¢×öµ½ÕâÒ»µã¾ÍÒª¼òµ¥µÃ¶àÁË¡£ÏÖÔÚÈÃÎÒÃÇ´Ó¶¨ÒåFormLabel.javaÀïµÄFormLabelµÄÅú×¢¿ªÊ¼£º
¡¡¡¡import java.lang.annotation.*;
¡¡¡¡@Retention(RetentionPolicy.RUNTIME)
¡¡¡¡@Target(ElementType.METHOD)
¡¡¡¡public@interface FormLabel {String label();
¡¡¡¡int width() default 40;
¡¡¡¡}
¡¡¡¡ÄãÓ¦¸Ã×¢Òâµ½µÄµÚÒ»¼þÊÂÊÇJavaʹÓÃÁËËü×Ô¼ºÄÚÖõÄһЩÅú×¢À´¶¨Åú×¢£º@RetentionºÍ@Target¡£@RetentionÓÃÀ´¶¨Òåͨ¹ýÉèÖÃRetentionPolicyµÄÖµÅú×¢Äܹ»ÔÚ¹¹½¨-ÔËÐйý³ÌÖдæÁô¶à¾Ã¡£ÕâÀïÎÒÃÇʹÓÃÁËRUNTIME£¬ÕâÒâζ×ÅÎÒÃǶ¨ÒåµÄÅú×¢½«»áÔÚÔËÐÐÆڼ䱻±£ÁôÔÚ´úÂëÀï¡£RetentionPolicy.SOURCE½«±»ÓÃÓÚÒ»¸öÎÒÃÇÏ£Íû±»±àÒëÆ÷ʹÓÃÈ»ºóÅ×ÆúµÄÅú×¢¡£RetentionPolicy.CLASSÈÃËüÃDZ£ÁôÔÚÉú³ÉµÄÀàÎļþÀµ«ÊÇÄܹ»ÔÚÔËÐÐÆڼ䱻JavaÐéÄâ»ú(JVM)·ÃÎʵ½¡£
¡¡¡¡ÔÚĬÈÏÇé¿öÏ£¬Äã¿ÉÒÔÔÚ´úÂëÀïµÄÈκεط½¶¼Ó¦ÓÃÅú×¢¡£@TargetÅú×¢ÈÃÄãÄܹ»½«ËüÏÞÖÆÔÚ´úÂëµÄÌض¨²¿·ÖÀï¡£ÔÚ±¾ÎÄÀÎÒÃÇ°ÑÄ¿±êÃé×¼ÁËElementType.METHOD£¬ÕâÒâζ×ÅËüÖ»Äܹ»Óë·½·¨¹ØÁªÔÚÒ»Æð¡£ÆäËûElementTypesÓÐCONSTRUCTOR¡¢FIELD¡¢LOCAL_VARIABLE¡¢PACKAGE¡¢PARAMETERºÍTYPE£¬Ã¿¸ö¶¼Äܹ»°ÑÅú×¢ÏÞÖƵ½¸ÃÖÖÀàÐ͵ÄJavaÓïÑÔÔªËØ£¬ËùÒÔÀýÈ磬ÉèÖÃTYPE½«Ö»ÔÊÐíÅúעΪ¶¨Òå¹ýµÄÕâÖÖÀàÐÍ£¬±ÈÈ磺
¡¡¡¡@OurAnnotation
¡¡¡¡public class OurAnnotatedClass {¡
¡¡¡¡ÖµµÃ×¢ÒâµÄÊÇ£¬@TargetÅú×¢Äܹ»½ÓÊܵ¥¸öElementType»òÕßÒ»¸öElementTypeÊý×飬Èç¹ûÄãÏëÒª½«Åú×¢ÏÞÖÆΪһϵÁÐÓïÑÔÔªËصĻ°¡£
¡¡¡¡ÏÂÃæÒ»²¿·ÖÊÇÅú×¢½Ó¿ÚµÄ¶¨Ò壻Õâ¾ÍÏñÊÇÒ»¸öÆÕͨµÄ½Ó¿ÚÉùÃ÷£¬³ýÁËÎÒÃÇÓÃ@interface½«Æä±ê¼ÇΪһ¸öÅú×¢¡£ÔÚÕâ¸ö½Ó¿ÚÀÎÒÃÇÈ»ºó¶¨ÒåÅú×¢µÄ·½·¨£¬¾ÍÏñÎÒÃÇÏ£ÍûÓÃÔÚÓëÅú×¢Ïà¹ØÁªµÄÐÅÏ¢ÉϵijéÏó·½·¨£¬ËùÒÔÎÒÃǾÍÓÐÁËString label()£¬ÓÃÓÚÒ»¸ö½Ð×ölabelµÄ×Ö·û´®ÊôÐÔ¡£Èç¹ûÎÒÃÇûÓз½·¨£¬ÄÇôÅú×¢¾ÍÖ»ÄÜÓÃÓÚ¡°×ö±ê¼Ç¡±£¬¶ø@Overrides×¢Ê;ÍÊÇÕâÑùÒ»¸öÀý×Ó¡£Èç¹ûÄãÖ»ÓÐÒ»¸öÊôÐÔ£¬Ëü×îºÃ±»ÃüÃûΪ¡°value¡±£¬ÒòΪµ±´øÓÐÒ»¸öδÃüÃû²ÎÊýµÄÅú×¢ÔÚÉèÖÃÕâ¸öֵʱ£¬Ëü¹¤×÷µÃ×îºÃ¡£ÊôÐÔ»¹¿ÉÒÔÓÐĬÈÏÖµ£¬±ÈÈç¡°int width() de
fault 40;¡±¾ÍÊÇÔÚ¶¨ÒåÒ»¸öĬÈÏֵΪ40µÄÕûÊýÊôÐÔ¡£
¡¡¡¡Õâ¾ÍÊÇÅú×¢¶¨Òå¡£ÎÒÃÇÏÖÔھͿÉÒÔÔÚ´úÂëÀïʹÓÃËüÁË¡£ÏÂÃæÒ»¸öSimpleDataÀà¾ÍÓõ½ÁËËü¡£
¡¡¡¡public class SimpleData {
¡¡¡¡private String firstname;
¡¡¡¡private String lastname;
¡¡¡¡private String postcode;
¡¡¡¡public SimpleData() {}
¡¡¡¡@FormLabel(label="First Name")
¡¡¡¡public String getFirstname() { return firstname; }
¡¡¡¡public void
¡¡¡¡setFirstname(String firstname) {this.firstname = firstname;}
¡¡¡¡@FormLabel(label="Last Name",width=80)
¡¡¡¡public String getLastname() { return lastname; }
¡¡¡¡public void setLastname(String lastname) {
¡¡¡¡this.lastname = lastname;
¡¡¡¡}
¡¡¡¡@FormLabel(label="Postal code",width=10)
¡¡¡¡public String getPostcode() { return postcode; }
¡¡¡¡public void setPostcode(String postcode) {
¡¡¡¡this.postcode = postcode;
¡¡¡¡}
¡¡¡¡}
¡¡¡¡µ±È»£¬Èç¹ûÎÒÃDz»²éÕÒÅú×¢£¬ÄÇôËüÃǶԴúÂëµÄÖ´ÐоͲ»»áÔì³ÉÈκβ»Í¬¡£ÎÒÃÇËùÐèÒªµÄÊÇÔÚÔËÐÐÆÚ¼äʹÓÃÅú×¢µÄ·½Ê½£»ÎÒÃÇͨ¹ýReflection APIÀ´´ïµ½ÕâһĿµÄ¡£ÏÖÔÚ¾ÍÈÃÎÒÃÇ´´½¨Ò»¸ö¼òµ¥µÄprocessForm·½·¨£¬ËüÄܹ»ÔÚÈκζÔÏóÀï²éÕÒÅú×¢¡£
¡¡¡¡public void processForm(Object o) {
¡¡¡¡for(Method m:o.getClass().getMethods()) {
¡¡¡¡ÎÒÃǽ«ÔÚ´«µÝ¸ø·½·¨µÄ¶ÔÏóµÄÀàÀﶨÒåËùÓеķ½·¨¡£ÏÖÔÚ£¬ÎÒÃÇÐèÒª¼ì²éÿ¸ö·½·¨£¬¿´¿´ËüÃÇÊÇ·ñÓÐFormLabelÅú×¢£¬ÒÔ¼°ÊÇ·ñ·µ»ØÒ»¸öString(ΪÁ˼òµ¥µØ˵Ã÷ÎÊÌ⣬ÎÒÃǸøËùÓеĽá¹û¶à·µ»ØһЩ´úÂë)£º
¡¡¡¡if(m.isAnnotationPresent(FormLabel.class) &&
¡¡¡¡m.getReturnType()==String.class) {
¡¡¡¡ÏÖÔÚÎÒÃÇ¿ÉÒÔͨ¹ýʹÓÃMethodµÄgetAnnotation()·½·¨À´ÌáÈ¡FormLabelÅú×¢£º
¡¡¡¡FormLabel formLabel=
¡¡¡¡m.getAnnotation(FormLabel.class);
¡¡¡¡ÏÖÔÚÎÒÃÇÖ´Ðз½·¨À´È¡µÃÆä×Ö·û´®Öµ£¬²¢Í¨¹ýÔÚÅú×¢½Ó¿ÚÀﶨÒåµÄ·½·¨·ÃÎÊÅú×¢ÊôÐÔ¡£ÏÂÃæÎÒÃǾͰÑËüÃÇ´òÓ¡³öÀ´£º
¡¡¡¡try {
¡¡¡¡String value=(String)m.invoke(o);
¡¡¡¡String label=formLabel.label();
¡¡¡¡int width=formLabel.width();
¡¡¡¡System.out.printf("%s[%d]:%s\n",label,width,value);
¡¡¡¡} catch (IllegalArgumentException ex) {
¡¡¡¡ex.printStackTrace();
¡¡¡¡}
¡¡¡¡catch (IllegalAccessException ex) {
¡¡¡¡ex.printStackTrace();}
¡¡¡¡catch (InvocationTargetException ex) {
¡¡¡¡ex.printStackTrace();
¡¡¡¡}
¡¡¡¡}
¡¡¡¡}
¡¡¡¡}
¡¡¡¡ÏÖÔÚÎÒÃÇ¿ÉÒÔ´´½¨º¬ÓÐ@FormLabelÅú×¢µÄÐÂÀ࣬²¢°ÑËüÃÇ´«µÝ¸øprocessForm·½·¨¡£ÕâÊÇÔÚÔËÐÐÆÚ¼ä·ÃÎÊÄã×Ô¼ºµÄÅú×¢µÄ»ù´¡¡£
¡¡¡¡ÏÖÔÚÕâ¸öʱºò£¬ÎÒÃÇ»ØÍ·¿´¿´Java 5ÀïÃæÆäËû¹ØÓÚÅú×¢µÄÄÚÈÝ¡£Ê×ÏÈÊDZàÒëÆ÷Ö¸Áî----@DeprecatedºÍ@SuppressWarnings¡£@DeprecatedÊÇ°Ñ·½·¨±êʾΪ±»·ñ¶¨µÄÔöÇ¿·½·¨£»²»ÍƼö°ÑËüÓÃÔÚдúÂëÀÒÔ·ÀÖ¹ÒÔºóɾ³ý¡£ÓÃ@Deprecated¿ÉÒÔÉú³ÉÒ»¸öÀ´×Ô±àÒëÆ÷µÄÏà¹Ø¾¯¸æ¡£
¡¡¡¡@SuppressWarnings»á×èÖ¹±àÒëÆ÷ÔÚ·â±Õ´úÂëÔªËØÀᆵ¸æÄ㣬ËùÒÔÄã¿ÉÒÔÔÚÀඨÒåµÄ¿ªÊ¼»òÕ߶ÔÌض¨µÄ·½·¨Ê¹ÓÃ@SuppressWarnings¡£Ëü¿ÉÒÔ´ø²ÎÊý£¬ÓÃÀ´Ö¸¶¨ÐèҪȡÏûµÄ´íÎóµÄÀàÐÍ£¬ÀýÈ磺
¡¡¡¡@SuppressWarnings("unchecked")
¡¡¡¡public List getList() {
¡¡¡¡List l=new LinkedList();
¡¡¡¡return l;
¡¡¡¡}
¡¡¡¡ÕâÀïÎÒÃÇÈ¡ÏûÁËÒ»¸ö¹ØÓÚÔÚListºÍListÖ®¼äµÄ¡°Î´¼ì²é¡±µÄÇ¿ÖÆת»»¡£µ±Ä㿪ʼÓÃJava±à³Ìµ«ÊÇûÓзÇÒ»°ã´úÂëµÄʱºò£¬Õâ¾Í·Ç³£ÓÐÓá£ÔÚÈ¡Ïû¾¯¸æµÄʱºò£¬¾¡¿ÉÄܵØËõСȡÏûµÄ·¶Î§ÊÇÖµµÃµÄ£»ÔÚÉÏÃæµÄÀý×ÓÀÎÒÃÇÈ¡ÏûÁËÕû¸ö´úÂë¡£ÎÒÃÇ¿ÉÒÔ°ÑËü±ä½ô´Õ£¬Ö»Òþ²ØÒ»¸öÓï¾äµÄ´íÎó£º
¡¡¡¡public List
¡¡¡¡getListToo() {
¡¡¡¡@SuppressWarnings("unchecked")
¡¡¡¡List l=new LinkedList();
¡¡¡¡return l;
¡¡¡¡}
¡¡¡¡Òª×¢ÒâµÄÊÇ£¬ÄãÐèÒªÔÚJava2SE 1.5.06»òÕßÒÔÉϵİ汾ÉϽøÐÐÕâÏ×÷£»Õâ֮ǰµÄ°æ±¾Ã»ÓÐÌṩ¶Ô@SuppressWarningÖ§³Ö¡£
¡¡¡¡Java 5ÀïÆäËûÄÚÖõÄÅú×¢¶¼Óë¶ÔÅú×¢µÄÖ§³ÖÓйØ----@DocumentedºÍ@Inherited¡£ËüÃǶ¼¿ÉÒÔ±»¼Óµ½Åú×¢¶¨ÒåÀï¡£@DocumentedµÄ×÷ÓÃÊÇ£¬Åú×¢µÄʹÓÃÓ¦¸ÃÔÚËùÓÐÉú³ÉµÄJavaDocÎĵµÀﶼ·´Ó³³öÀ´¡£ÕýÈçÄã¿ÉÄÜ¿´µ½µÄ£¬Åú×¢ºÍJavaDoc±ê¼ÇÊÇ»¥²¹µÄ¡£@InheritedµÄÒâ˼ÊÇ£¬µ±ÁíÍâÒ»¸öÀàÓÃÀàÀ´À©Õ¹Åúעʱ£¬Åú×¢Ó¦¸ÃÊǿɼ̳еģ»ÔÚĬÈÏÇé¿öÏ£¬Åú×¢ÊDz»Äܱ»¼Ì³ÐµÄ¡£
¡¡¡¡Äã¿ÉÄܺÜÏ£ÍûÔÚ×Ô¼ºµÄ¿ª·¢ÏîÄ¿ÀïʹÓÃJavaÅú×¢µÄ·½·¨¡£¾ÍÏñÎÒÔÚÒýÑÔÀï½²µ½µÄ£¬Åú×¢ÒѾ³ÉΪÏÖ´úJava¿ò¼ÜºÍÓ¦ÓóÌÐòµÄÖØÒªÒ»²¿·Ö£»¾ÍÄÃJUnit4¾Ù¸öÀý×Ó£¬JavaÅú×¢ÒѾÔÊÐíJUnitµÄ¿ª·¢ÈËÔ±ÓÐÁËÒÔ¸ü·á¸»µÄ·½Ê½±íʾ²âÊԵķ½·¨£¬¶ø²»ÓÃÒªÇó²âÊÔ±àдÕßÇ¿ÖÆʹÓÃͳһµÄÃüÃû¹æÔò¡£»¹ÓÐGrails£¬ÕâÀïÅú×¢¿ÉÒÔ±»ÓÃÀ´Ïò¡°ÀàËÆÌú¹ì(rails-like)¡±µÄ¿ò¼ÜÌṩÐÅÏ¢¡£Åú×¢µÄÄÜÁ¦Óкܶ࣬µ«ÊÇÒª¼Çס£¬ÄÜÁ¦Ô½´ó£¬ÔðÈÎÒ²Ô½´ó¡£Åú×¢ÊÇΪÁ˸ø¿ª·¢ÈËÔ±Ìṩ±ê¼ÇÐÅÏ¢£¬¶ø²»ÊÇÓÃÀ´Òþ²ØÔËÐÐÅäÖá£
¡¡¡¡Äã¿ÉÒÔÔÚÕâÀïÏÂÔÚ±¾½Ì³ÌÀïËùÓÐʾÀýµÄÔ´´úÂë¡£
¡¡¡¡DJ Walker-MorganÊÇÒ»Ãû×Éѯ¿ª·¢ÈËÔ±£¬×¨³¤ÊÇJavaºÍÓû§µ½Óû§µÄÏûÏ¢´«ËͺÍÊÓƵ»áÒé¡£