锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成aⅴ人片久青草影院,国产亚洲成av人片在线观看,亚洲AV成人一区二区三区观看http://www.tkk7.com/dyerac/dyerac In Javazh-cnFri, 09 May 2025 18:25:25 GMTFri, 09 May 2025 18:25:25 GMT60Openfire, spark, red5http://www.tkk7.com/dyerac/archive/2007/09/29/149692.htmldyerac in java...dyerac in java...Sat, 29 Sep 2007 14:06:00 GMThttp://www.tkk7.com/dyerac/archive/2007/09/29/149692.htmlhttp://www.tkk7.com/dyerac/comments/149692.htmlhttp://www.tkk7.com/dyerac/archive/2007/09/29/149692.html#Feedback2http://www.tkk7.com/dyerac/comments/commentRss/149692.htmlhttp://www.tkk7.com/dyerac/services/trackbacks/149692.htmlOpenfire錛堝師鏉ョ殑Wildfire錛夋槸涓涓法騫沖彴錛岄噰鐢↗ava寮鍙戯紝寮婧愮殑瀹炴椂鍗忎綔錛圧TC錛夋湇鍔″櫒鍩轟簬XMPP錛圝abber錛夊崗璁侽penfire瀹夎鍜屼嬌鐢ㄩ兘闈炲父綆鍗曪紝騫跺埄鐢╓eb榪涜綆$悊銆傚崟鍙版湇鍔″櫒鍙敮鎸佷笂涓囧茍鍙戠敤鎴?br />
Spark鏄疧penfire鐨勫鎴風錛?br />
Red5鏄熀浜巎ava鐨刦lash嫻佸獟浣撴湇鍔″櫒

 

浠ュ悗鏈夊叴瓚e氨鐮旂┒涓涓嬪瓙鍚?/p>

dyerac in java... 2007-09-29 22:06 鍙戣〃璇勮
]]>
鎵嬪姩鍒涘緩涓涓柊Classhttp://www.tkk7.com/dyerac/archive/2007/08/13/136473.htmldyerac in java...dyerac in java...Mon, 13 Aug 2007 10:52:00 GMThttp://www.tkk7.com/dyerac/archive/2007/08/13/136473.htmlhttp://www.tkk7.com/dyerac/comments/136473.htmlhttp://www.tkk7.com/dyerac/archive/2007/08/13/136473.html#Feedback0http://www.tkk7.com/dyerac/comments/commentRss/136473.htmlhttp://www.tkk7.com/dyerac/services/trackbacks/136473.html
public class NewMain {
    public static void main(String[] args) {
        new Object();
    }
}

鐢╦avap鍙嶇紪璇戜笂闈㈢殑浠g爜錛屾垜浠彲浠ュ緱鍒頒笅闈㈢殑鎸囦護錛岃繖閲岀渷鍘諱簡javac鏆椾腑鍒涘緩鐨勬瀯閫犲嚱鏁般?br>
public class NewMain extends java.lang.Object{
    ...
public static void main(java.lang.String[]);
  Code:
   0:   new     #3; //class java/lang/Object
   3:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   6:   return
}

浠庤繖孌典唬鐮佷腑錛屾垜浠彲浠ユ竻鏅扮殑鐪嬪嚭鍒涘緩瀵硅薄錛坣ew錛夊拰璋冪敤鏋勯犲嚱鏁幫紙invokespecial錛変袱涓繃紼嬨傚叧浜庤繖涓棶棰橈紝鎴戝湪銆?a target=_blank>瀵硅薄鐨勭敓鍛?/font>銆嬩腑鏇劇粡榪涜榪囪璁恒?br>
鏃㈢劧javac灝嗕竴涓猲ew鐨勫姩浣滆瑙i噴涓轟袱鏉℃寚浠わ紝閭e湪JVM鐨勫眰闈笂錛屾垜浠綋鐒跺氨鍙互灝嗗畠浠垎寮銆備笅闈㈡槸涓孌墊病浠涔堝疄闄呯敤閫旂殑浠g爜錛屽彧鏄瘉鏄庤繖涓鐐瑰彲琛屾с?br>
public class NewGenerator {
    public static void main(String[] args) throws Exception {
        String className = "New";
        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        cw.visit(Opcodes.V1_2, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null);
        Method m = Method.getMethod("void main (String[])");
        GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, m, null, null, cw);
        mg.newInstance(Type.getType(Object.class));
        Label label = mg.newLabel();
        mg.ifNonNull(label);
        mg.mark(label);
        mg.getStatic(Type.getType(System.class), "out", Type.getType(PrintStream.class));
        mg.push("new object is not null");
        mg.invokeVirtual(Type.getType(PrintStream.class), Method.getMethod("void println(java.lang.String)"));
        mg.pop();
        mg.returnValue();
        mg.endMethod();
        cw.visitEnd();

        OutputStream os = null;
        try {
            os = new FileOutputStream(className + ".class");
            os.write(cw.toByteArray());
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }
}

榪欐浠g爜鐢熸垚鐨勭被鏄兘澶熻繍琛岀殑錛屾湁鍏磋叮鐨勫彲浠ヨ嚜宸辮瘯涓涓嬨傝繖孌典唬鐮佺殑浣滅敤鏄痭ew鍑轟竴涓璞′箣鍚庯紝濡傛灉榪欎釜瀵硅薄闈炵┖鐨勮瘽錛屽氨浼氫駭鐢熶竴涓緭鍑猴細
    new object is not null

褰撶劧錛屽鏋滃皾璇曠敤榪欎釜瀵硅薄鍋氫竴浜涘叾瀹冪殑鎿嶄綔錛屼細鏈夐敊璇瓑寰呯潃鎴戜滑錛屽洜涓鴻繖涓璞″茍涓嶆槸涓涓畬鏁寸殑瀵硅薄銆傚湪JVM瑙勮寖涓湁鐩稿叧鐨勮В閲婏細new鎸囦護騫朵笉鑳藉畬鏁村垱寤哄嚭涓涓柊鐨勫璞★紝鐩村埌瀵規湭鍒濆鍖栫殑瀵硅薄璋冪敤浜嗗疄渚嬪垵濮嬪寲鏂規硶鎵嶄細瀹屾垚瀹炰緥鐨勫垱寤恒傝繖孌典唬鐮佷篃姝eソ絎﹀悎銆?a target=_blank>瀵硅薄鐨勭敓鍛?/font>銆嬩腑鐨勮В閲婏紝瀹冨彧鏄礋璐e仛鍑虹敵璇峰唴瀛樸傚綋鐒訛紝鍦↗VM涓紝瀹冪殑瀹為檯宸ヤ綔瑕佺暐澶氫竴浜涳紝濡傛灉榪欎釜瀵硅薄鐨勭被娌℃湁鍔犺澆錛屽氨浼氬姞杞界浉搴旂殑綾匯?br>

]]>
Google Ajax Search api 浠ュ強 web api 鐨勮璁″拰鏋舵瀯?http://www.tkk7.com/dyerac/archive/2007/07/25/132362.htmldyerac in java...dyerac in java...Wed, 25 Jul 2007 09:52:00 GMThttp://www.tkk7.com/dyerac/archive/2007/07/25/132362.htmlhttp://www.tkk7.com/dyerac/comments/132362.htmlhttp://www.tkk7.com/dyerac/archive/2007/07/25/132362.html#Feedback0http://www.tkk7.com/dyerac/comments/commentRss/132362.htmlhttp://www.tkk7.com/dyerac/services/trackbacks/132362.html棰樿:
鍏跺疄鎴戣繖綃囨枃绔犵函綺規槸鎶涚爾寮曠帀涔嬫剰
Google Ajax Search 鐨刟pi浣跨敤璧鋒潵騫朵笉鍥伴毦,濡傛灉鏈夐珮鎵嬪姝や笉灞戜竴欏劇殑璇?涓嶅Θ鍥炵瓟涓涓嬫垜鐨勭湡姝g敤鎰?閭e氨鏄竴涓嚭鑹茬殑web api璇ュ浣曡璁″憿? 瀹冪殑浣撶郴鏋舵瀯鏄粈涔? 鎴戝姝ゆ湁涓垵姝ョ殑鎯蟲硶, 鍓嶇寮鍙戣嚜宸辯殑js搴? 璋冪敤榪滅鐨勬湇鍔? 浣嗘槸鍏蜂綋瀹炴柦璇ュ浣曞憿? 浼犺緭鏂瑰紡璇ユ槸濡備綍? JSON? 鑷畾涔塜ML? 榪樻槸SOAP? 鐜板湪寰堢伀鐨凴EST瀵?web api鐨勮璁℃湁浠涔堝獎鍝? 榪樻湜鍚勪綅楂樻墜璧愭暀 ^_^

鍥炲埌姝i,鐪嬬湅濡備綍鐢╣oogle api鏋勫緩鑷繁鐨刟jax 鎼滅儲.  闃呰鍏ㄦ枃

]]>
鍔ㄦ佷唬鐞?Dynamic Proxy錛塉ava Servlet http://www.tkk7.com/dyerac/archive/2007/07/24/132051.htmldyerac in java...dyerac in java...Tue, 24 Jul 2007 07:10:00 GMThttp://www.tkk7.com/dyerac/archive/2007/07/24/132051.htmlhttp://www.tkk7.com/dyerac/comments/132051.htmlhttp://www.tkk7.com/dyerac/archive/2007/07/24/132051.html#Feedback0http://www.tkk7.com/dyerac/comments/commentRss/132051.htmlhttp://www.tkk7.com/dyerac/services/trackbacks/132051.html鍩烘湰涓婁簡瑙d簡鍔ㄦ佷唬鐞嗙殑鏈哄埗
灝卞樊鍐欎釜浠g爜瀹為獙涓涓?br>

------------------------------------------------------------------------------------------------------------------------


浠嶫DK1.3寮濮嬶紝Java灝卞紩鍏ヤ簡鍔ㄦ佷唬鐞嗙殑姒傚康銆傚姩鎬佷唬鐞嗭紙Dynamic Proxy錛夊彲浠ュ府鍔╀綘鍑忓皯浠g爜琛屾暟錛岀湡姝f彁楂樹唬鐮佺殑鍙鐢ㄥ害銆備緥濡傦紝浣犱笉蹇呬負鎵鏈夌殑綾葷殑鏂規硶閲岄潰閮藉啓涓婄浉鍚岀殑Log浠g爜琛岋紝鍙栬屼唬涔嬬殑鏄疄鐢ㄧ被鐨勫姩鎬佷唬鐞嗙被銆傚綋鐒訛紝榪欑渚垮埄鏄湁鏉′歡鐨勩傛湰鏂囩畝鍗曚粙緇岼ava鍔ㄦ佷唬鐞嗙殑鍘熺悊錛屽茍瀹炵幇涓涓浠g悊鐨凷ervlet鍒涘緩錛屽拰璋冪敤鐨勮繃紼嬨?
 
1錛?/span>浠g悊妯″紡錛圥roxy Pattern錛?/div>
鍦↗DK1.3浠ュ墠錛屼唬鐞嗘ā寮忓氨宸叉祦琛岋紝鎵浠ュ緱浠g悊妯″紡鏄敓鎴愪竴涓拰綾葷浉鍚屾帴鍙g殑浠g悊綾伙紝鐢ㄦ埛閫氳繃浣跨敤浠g悊綾繪潵灝佽鏌愪釜瀹炵幇綾匯傚鍥?錛屽叾鐩殑鏄姞寮哄疄鐜扮被鐨勬煇涓柟娉曠殑鍔熻兘錛岃屼笉蹇呮敼鍙樺師鏈夌殑婧愪唬鐮併?/div>

2錛?/span>鍔ㄦ佷唬鐞嗭紙Dynamic Proxy錛?/div>
闅忕潃Proxy鐨勬祦琛岋紝Sun鎶婂畠綰沖叆鍒癑DK1.3瀹炵幇浜咼ava鐨勫姩鎬佷唬鐞嗐傚姩鎬佷唬鐞嗗拰鏅氱殑浠g悊妯″紡鐨勫尯鍒紝灝辨槸鍔ㄦ佷唬鐞嗕腑鐨勪唬鐞嗙被鏄敱java.lang.reflect.Proxy綾誨湪榪愯鏈熸椂鏍規嵁鎺ュ彛瀹氫箟錛岄噰鐢↗ava鍙嶅皠鍔熻兘鍔ㄦ佺敓鎴愮殑銆傚拰java.lang.reflect.InvocationHandler緇撳悎錛屽彲浠ュ姞寮虹幇鏈夌被鐨勬柟娉曞疄鐜般傚鍥?錛屽浘涓殑鑷畾涔塇andler瀹炵幇InvocationHandler鎺ュ彛錛岃嚜瀹氫箟Handler瀹炰緥鍖栨椂錛屽皢瀹炵幇綾諱紶鍏ヨ嚜瀹氫箟Handler瀵硅薄銆傝嚜瀹氫箟Handler闇瑕佸疄鐜癷nvoke鏂規硶錛岃鏂規硶鍙互浣跨敤Java鍙嶅皠璋冪敤瀹炵幇綾葷殑瀹炵幇鐨勬柟娉曪紝鍚屾椂褰撶劧鍙互瀹炵幇鍏朵粬鍔熻兘錛屼緥濡傚湪璋冪敤瀹炵幇綾繪柟娉曞墠鍚庡姞鍏og銆傝孭roxy綾繪牴鎹瓾andler鍜岄渶瑕佷唬鐞嗙殑鎺ュ彛鍔ㄦ佺敓鎴愪竴涓帴鍙e疄鐜扮被鐨勫璞°傚綋鐢ㄦ埛璋冪敤榪欎釜鍔ㄦ佺敓鎴愮殑瀹炵幇綾繪椂錛屽疄闄呬笂鏄皟鐢ㄤ簡鑷畾涔塇andler鐨刬nvoke鏂規硶銆?/div>
  

3錛庡姩鎬佷唬鐞哠ervlet
              铏界劧Web Application Server鐨勪駭鍝佸緢澶氾紝浣哠ervlet鐨勫鐞嗗師鐞嗘槸鐩鎬技鐨勶細鍔ㄦ佸姞杞絊ervlet錛岃皟鐢⊿ervlet鐨刬nit鏂規硶錛堝彧琚皟鐢ㄤ竴嬈★級錛屽茍淇濆瓨鍒癝ervlet瀹瑰櫒錛汼ervlet浣跨敤鏃訛紝璋冪敤Servlet鐨剆ervice鏂規硶銆傛湰鏂囧姩鎬佷唬鐞哠ervlet鎺ュ彛錛屼嬌鍏秈nit鍜宻ervice琚皟鐢ㄦ椂浼氬湪鎺у埗鍙版墦鍑烘柟娉曡皟鐢ㄥ墠鍚庝俊鎭?/div>
棣栧厛瀹炵幇2涓猄ervlet錛孌efaultServlet鍜孶serServlet
 
package org.colimas.servlet;
 
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
 
public class DefaultServlet extends HttpServlet implements Servlet {
              public void init() throws ServletException {
                            super.init();
                            System.out.println(DefaultServlet.class.getName()+":Running init");
              }
 
              public String getServletInfo() {
                            return DefaultServlet.class.getName();
              }
}
 
package org.colimas.servlet;
 
import java.io.IOException;
 
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
public class UserServlet extends HttpServlet implements Servlet {
 
              private static final long serialVersionUID = -7016554795165038652L;
             
              public void init() throws ServletException {
                            super.init();
                            System.out.println(UserServlet.class.getName()+":Running init");
              }
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                         
                            System.out.println(UserServlet.class.getName()+":Do UserSErvlet Get");
              }
              public String getServletInfo() {
                            return UserServlet.class.getName();
              }            
             
 
}
 
鐒跺悗瀹炵幇InvocationHandler
package org.colimas.webapp;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
 
import javax.servlet.Servlet;
 
public class ServletHandler implements InvocationHandler {
 
              private Servlet obj;
             
              public ServletHandler(Servlet obj){
                            this.obj=obj;
              }
              public Object invoke(Object arg0, Method arg1, Object[] arg2)
                                          throws Throwable {
                           
                            if(arg1.getName().compareTo("init")==0) //璋冪敤init鏃?/div>
                            {
                                          System.out.println(obj.getServletInfo()+":Init servlet starting..."); //澧炲姞鎺у埗鍙拌緭鍑恒?/div>
                                          arg1.invoke(obj,arg2); //璋冪敤init鏂規硶
                                          System.out.println(obj.getServletInfo()+":Init servlet ending..."); //澧炲姞鎺у埗鍙拌緭鍑恒?/div>
                            }else if(arg1.getName().compareTo("service")==0){ //璋冪敤service鏃?/div>
                                          System.out.println(obj.getServletInfo()+":service starting..."); //澧炲姞鎺у埗鍙拌緭鍑恒?/div>
 
                                          arg1.invoke(obj,arg2); //璋冪敤service鏂規硶銆?/div>
                                          System.out.println(obj.getServletInfo()+":service ending..."); //澧炲姞鎺у埗鍙拌緭鍑恒?/div>
                           
                            }
                            return null;
              }
 
}
 
瀹炵幇Servlet鐨勮皟鐢?/div>
package org.colimas.webapp;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
 
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
 
public class ServletWrapperImp {
   
    private Class servletClass;
    private ServletConfig config;
    private String _servletname;
    private Servlet _theServlet;
              private ServletContext context;
    public ServletWrapperImp(ServletConfig config){
           this.config=config;
           this._servletname=this.config.getServletName();
           this.context=this.config.getServletContext();
    }
   
    public Servlet getServlet() throws ServletException{
 
                              destroy();
                              try {
                                            WebAppClassLoader loader=new WebAppClassLoader(this.getClass().getClassLoader()); //鑷畾涔塩lass loader
                                            String name=getServletName(); //浠嶴ervletConfig涓幏寰桽ervlet Name
                                            synchronized (context) {
                                                          Servlet theServlet=context.getServlet(name); //鍦⊿ervletContext涓煡鎵維ervlet
                                                          if(theServlet==null){         //濡傛灉ServletContext娌℃湁銆?span>              
                                                                        servletClass = loader.loadClass(name); //鐢盋lass loader 鍔犺澆Servlet class銆?/div>
                                                              theServlet = (Servlet) servletClass.newInstance(); //Servlet瀹炰緥鍖栥?/div>
                                                              WebAppContext.addServlet(name,theServlet); //灝哠ervlet瀹炰緥瀛樺叆ServletContext銆?/div>
                                                                        InvocationHandler handler=new ServletHandler(theServlet); //鑷畾涔塖ervletHandler錛屽弬瑙丼ervletHandler綾匯?/div>
                                                                        _theServlet=(Servlet)Proxy.newProxyInstance(theServlet.getClass().getClassLoader(),
                                                                                   new Class[]{Servlet.class},handler); //浠g悊綾誨疄渚嬪寲銆?/div>
                                                                        _theServlet.init(config); //Servlet浠g悊瀵硅薄璋冪敤init鏂規硶銆傚弬瑙丼ervletHandler鐨刬nvoke鏂規硶銆?/div>
                                                                       
                                                          }else{ //ServletContext閲屽凡瀛樺湪銆?/div>
                                                                        InvocationHandler handler=new ServletHandler(theServlet); //鑷畾涔塖ervletHandler錛屽弬瑙丼ervletHandler綾匯?/div>
                                                                        _theServlet=(Servlet)Proxy.newProxyInstance(theServlet.getClass().getClassLoader(),
                                                                                   new Class[]{Servlet.class},handler);                 //浠g悊Servlet鎺ュ彛錛屽姩鎬佺敓鎴愪唬鐞嗙被錛屽茍瀹炰緥鍖栥?span>                                  
                                                          }
                                            }
                                            return _theServlet; //榪斿洖Servlet浠g悊瀵硅薄
                              } catch( ClassNotFoundException ex1 ) {
                                
                              } catch( InstantiationException ex ) {
                                 
                              }catch(IllegalAccessException ex2){
                                           
                              }
                      return null;
    }
    public void destroy() {
        if (_theServlet != null) {
                      _theServlet.destroy();
        }
    }   
   
    protected String getServletName(){
           return _servletname;
    }
}
 
鍏朵腑鐨凷ervletConfig淇濆瓨Servlet鐩稿叧淇℃伅銆係ervletContext淇濆瓨鎵鏈夌殑Servlet瀵硅薄銆俉ebAppClassLoader涓鴻嚜瀹氫箟class loader,鍙傝http://blog.csdn.net/tyrone1979/archive/2006/09/03/1164262.aspx銆?/div>
 
鏈鍚庣紪鍐欐祴璇曠被Main錛岃綾繪ā鎷?0涓敤鎴瘋闂甋ervlet錛?浜鴻闂瓺efaultServlet錛?浜鴻闂甎serServlet銆?/div>
package org.colimas.main;
 
import java.io.IOException;
 
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
 
import org.colimas.webapp.HttpServletRequestWrapper;
import org.colimas.webapp.HttpServletResponseWrapper;
import org.colimas.webapp.ServletConfigImpl;
import org.colimas.webapp.ServletWrapper;
import org.colimas.webapp.ServletWrapperImp;
import org.colimas.webapp.WebAppContext;
 
public class Main {
 
              private ThreadGroup _threadGroup;
              private Thread[] _threads;
              String defaultServletName="org.colimas.servlet.DefaultServlet";
              String userServletName="org.colimas.servlet.UserServlet";
              WebAppContext context=WebAppContext.newInstance();     
             
              public void doStart(){
             
                            _threadGroup=new ThreadGroup("SERVLETS");
                            int i=0;
                            _threads=new ServletThread[10]; //妯℃嫙10浣嶇敤鎴楓?/div>
                            for(i=0;i<5;i++){
                                          _threads[i]=new ServletThread(_threadGroup,new Integer(i).toString(),
                                                                      defaultServletName);
                                          _threads[i].start();
                            }
                            for(i=5;i<10;i++){
                                          _threads[i]=new ServletThread(_threadGroup,new Integer(i).toString(),
                                                                      userServletName);
                                          _threads[i].start();
                            }                          
                           
              }
              /**
               * @param args
               */
              public static void main(String[] args) {
                            Main _main=new Main();
                            _main.doStart();
                           
              }
              //妯℃嫙鐢ㄦ埛綰跨▼
              private class ServletThread extends Thread{
                           
                            private String servletName;
                           
                            public ServletThread(ThreadGroup group,String threadname,String servletname){
                                          super(group,threadname);
                                          servletName=servletname;
                            }
                            //璋冪敤Servlet鐨剆ervice.
                            public void run() { //鐢ㄦ埛璋冪敤Servlet
                                          ServletConfig config=new ServletConfigImpl(servletName,context); //璋冪敤鐨凷ervlet淇℃伅銆?/div>
                                          ServletWrapperImp wrapper=new ServletWrapperImp(config);
                                          try {
                                                        Servlet defaultServlet=wrapper.getServlet(); //鑾峰緱Servlet瀵硅薄錛屽疄闄呮槸Servlet鐨勪唬鐞嗗璞?/div>
                                                        defaultServlet.service(new HttpServletRequestWrapper(),
                                                                                    new HttpServletResponseWrapper()); 璋冪敤浠g悊瀵硅薄鐨剆ervice鏂規硶錛屽弬瑙丼ervletHandler鐨刬nvoke鏂規硶銆?/div>
                                          } catch (ServletException e) {
                                                                                                                e.printStackTrace();
                                          } catch(IOException e){
                                                       
                                          }
                            }
                           
              }
}
HttpServletRequestWrapper鍜孒ttpServletResponseWrapper瀹炵幇HttpServletRequest錛屽拰HttpServletResponse銆?/div>
嫻嬭瘯緇撴灉濡備笅
org.colimas.servlet.DefaultServlet:Init servlet starting...
org.colimas.servlet.DefaultServlet:Running init
org.colimas.servlet.DefaultServlet:Init servlet ending...
org.colimas.servlet.UserServlet:Init servlet starting...
org.colimas.servlet.UserServlet:Running init
org.colimas.servlet.UserServlet:Init servlet ending...
org.colimas.servlet.DefaultServlet:service starting...
org.colimas.servlet.DefaultServlet:service ending...
org.colimas.servlet.DefaultServlet:service starting...
org.colimas.servlet.DefaultServlet:service ending...
org.colimas.servlet.UserServlet:service starting...
org.colimas.servlet.UserServlet:Do UserSErvlet Get
org.colimas.servlet.UserServlet:service ending...
org.colimas.servlet.UserServlet:service starting...
org.colimas.servlet.UserServlet:Do UserSErvlet Get
org.colimas.servlet.UserServlet:service ending...
org.colimas.servlet.UserServlet:service starting...
org.colimas.servlet.UserServlet:Do UserSErvlet Get
org.colimas.servlet.UserServlet:service ending...
org.colimas.servlet.UserServlet:service starting...
org.colimas.servlet.DefaultServlet:service starting...
org.colimas.servlet.UserServlet:service starting...
org.colimas.servlet.DefaultServlet:service starting...
org.colimas.servlet.DefaultServlet:service starting...
org.colimas.servlet.UserServlet:Do UserSErvlet Get
org.colimas.servlet.DefaultServlet:service ending...
org.colimas.servlet.UserServlet:Do UserSErvlet Get
org.colimas.servlet.DefaultServlet:service ending...
org.colimas.servlet.DefaultServlet:service ending...
org.colimas.servlet.UserServlet:service ending...
org.colimas.servlet.UserServlet:service ending...
 
2涓猄ervlet絎竴嬈oad鏃跺垵濮嬪寲錛岃璋冪敤init錛屼箣鍚庝繚瀛樺埌ServletContext涓傜浜屾鐩存帴浠嶴ervletContext鑾峰緱錛屾墽琛宻ervice銆傜孩瀛楄〃紺轟唬鐞嗙被閲屽鍔犵殑杈撳嚭緇撴灉銆?/div>
 
4錛庡姩鎬佷唬鐞嗙殑闄愬埗
              JDK鐨勫姩鎬佷唬鐞嗗茍涓嶈兘闅忓績鎵嬈茬殑浠g悊鎵鏈夌殑綾匯侾roxy.newProxyInstance鏂規硶鐨勭浜屼釜鍙傛暟鍙兘鏄帴鍙f暟緇勶紝 涔熷氨鏄疨roxy鍙兘浠g悊鎺ュ彛銆?/div>

 



]]>鍔ㄦ佷唬鐞?鍖呰鍣ㄦā寮?/title><link>http://www.tkk7.com/dyerac/archive/2007/07/24/132037.html</link><dc:creator>dyerac in java...</dc:creator><author>dyerac in java...</author><pubDate>Tue, 24 Jul 2007 06:03:00 GMT</pubDate><guid>http://www.tkk7.com/dyerac/archive/2007/07/24/132037.html</guid><wfw:comment>http://www.tkk7.com/dyerac/comments/132037.html</wfw:comment><comments>http://www.tkk7.com/dyerac/archive/2007/07/24/132037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/dyerac/comments/commentRss/132037.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/dyerac/services/trackbacks/132037.html</trackback:ping><description><![CDATA[<p>杞殑榪欑瘒鏂囩珷铏界劧鏄鍔ㄦ佷唬鐞嗙殑<br>浣嗘槸鍏朵腑娑夊強鍒頒簡Decorator妯″紡 涔熸槸涓涓涔犵殑浜偣<br><br><br><br><br>-----------------------------------------------------------------------------------------------------<br>璁板繂鏄鐢熻嚜Lisp,Python,鍜孭erl絳夎繃紼嬫ц璦鐨勪竴縐嶈璁℃ā寮忥紝瀹冨彲浠ュ鍓嶆鐨勮綆楃粨鏋滆繘琛岃蹇嗐?nbsp;涓涓疄鐜頒簡璁板繂鍔熻兘鐨勫嚱鏁? 甯︽湁鏄懼紡鐨刢ache, 鎵浠? 宸茬粡璁$畻榪囩殑緇撴灉灝辮兘鐩存帴浠巆ache涓幏寰? 鑰屼笉鐢ㄦ瘡嬈¢兘榪涜璁$畻.<br>璁板繂鑳芥樉钁楃殑鎻愬崌澶ц綆楅噺浠g爜鐨勬晥鐜? 鑰屼笖鏄竴縐嶅彲閲嶇敤鐨勬柟妗?<br>鏈枃闃愯堪浜嗗湪Java涓嬌鐢ㄨ繖涓妯″紡鐨勬柟娉?騫舵彁渚涗簡涓涓彲浠ユ彁渚涗笂榪板姛鑳界殑"璁板繂綾?:<br>     Foo foo = (Foo) Memoizer.memoize(new FooImpl());<br>     榪欓噷,Foo鏄竴涓帴鍙?瀹冨惈鏈夌殑鏂規硶鏄渶瑕佽蹇嗙殑.FooImpl鏄疐oo鐨勪竴涓疄鐜?foo鏄疐oo鐨勪竴涓紩鐢?鏂規硶涓嶧ooImpl鍩烘湰鐩稿悓,鍖哄埆鍦ㄤ簬Foo榪斿洖鐨勫?浼氳緙撳瓨璧鋒潵.鍗曚釜璁板繂綾葷殑浼樼偣鍦ㄤ簬涓轟換浣曠被娣誨姞璁板繂鍔熻兘鏄緢綆鍗曠殑:瀹氫箟涓涓寘鍚渶瑕佽蹇嗙殑鏂規硶鐨勬帴鍙?鐒跺悗璋冪敤memoize鏉ュ疄鐜頒竴涓疄渚?<br><br>    涓轟簡鐞嗚В璁板繂綾繪槸鎬庝箞瀹炵幇鐨?鎴戜滑灝嗗垎鍑犳鏉ヨВ閲?棣栧厛,鎴戣В閲婁竴涓嬩負浣曠紦瀛樿兘澶熷湪闇瑕佸畠鐨勭被涓疄鐜?鐒跺悗,鎴戞祴璇曚竴涓嬪浣曚負涓涓壒瀹氱殑綾繪坊鍔犵紦瀛樺寘瑁呭櫒.鏈鍚?鎴戣В閲婁竴涓嬪浣曟墠鑳戒嬌寰椾竴涓紦瀛樺寘瑁呭櫒鑳藉閫氱敤浜庝換鎰忕殑綾?<br><br><strong>涓哄ぇ璁$畻閲忕殑紼嬪簭娣誨姞緙撳瓨</strong><br>    浣滀負涓涓ぇ璁$畻閲忕▼搴忕殑渚嬪瓙,鎴戜滑鑰冭檻PiBinaryDigitsCalculator榪欎釜渚嬪瓙-璁$畻浜岃繘鍒舵暟鎹畃i.浠呮湁鐨刾ublic鏂規硶calculateBinaryDigit甯︽湁涓涓弬鏁?鏁存暟n,浠h〃闇瑕佺簿紜埌鐨勪綅鏁?渚嬪,1000000,灝嗕細榪斿洖灝忔暟鐐瑰悗鐨勪竴鐧句竾浣?閫氳繃byte鍊艱繑鍥?姣忎綅涓?鎴栬?.(綆楁硶鍙互鍙傝? <a target=_blank><font color=#002c99><u>http://www.cecm.sfu.ca/~pborwein/PAPERS/P123.pdf</u></font></a>)<br><br><code>public class PiBinaryDigitsCalculator {<br>  /**<br>   * Returns the coefficient of 2^n in the binary<br>   * expansion of pi.<br>   * @param n the binary digit of pi to calculate.<br>   * @throws ValidityCheckFailedException if the validity<br>   * check fails, this means the implementation is buggy<br>   * or n is too large for sufficient precision to be<br>   * retained.<br>   */<br>  public byte calculateBinaryDigit(final int n) {<br>      return runBBPAlgorithm(n);<br>  }<br>    <br>  private byte runBBPAlgorithm(final int n) {<br>      // Lengthy routine goes here ...<br>  }<br><br>}</code><br>    鏈綆鍗曠洿鎺ョ殑鏂規硶鏉ョ紦瀛樿繑鍥炲煎彲浠ラ氳繃淇敼榪欎釜綾繪潵瀹炵幇:娣誨姞涓涓狹ap鏉ヤ繚瀛樹箣鍓嶈綆楀緱鍒扮殑鍊?濡備笅:<br><code>import java.util.HashMap;<br><br>public class PiBinaryDigitsCalculator {<br><br>  private HashMap cache = new HashMap();<br><br>  public synchronized byte calculateBinaryDigit(<br>  final int n) {<br><br>      final Integer N = new Integer(n);<br>      Byte B = (Byte) cache.get(N);<br>      if (B == null) {<br>          byte b = runBBPAlgorithm(n);<br>          cache.put(N, new Byte(b));<br>          return b;<br>      } else {<br>          return B.bytevalue();<br>      }<br>  }<br><br>  private byte runBBPAlgorithm(final int n) {<br>      // Lengthy routine goes here ...<br>  }<br>}</code><br> <br>    calculateBinaryDigit鏂規硶棣栧厛浼氭鏌ashMap閲岄潰鏄惁緙撳瓨浜嗚繖涓叧閿瓧-鍙傛暟n,濡傛灉鎵懼埌浜?灝辯洿鎺ヨ繑鍥炶繖涓?鍚﹀垯,灝變細榪涜榪欎釜鍐楅暱鐨勮綆?騫跺皢緇撴灉淇濆瓨鍒扮紦瀛橀噷闈?鍦ㄦ坊鍔犺繘HashMap鐨勬椂鍊?鍦ㄥ師濮嬬被鍨嬪拰瀵硅薄涔嬮棿榪樿榪涜灝忓皬鐨勮漿鎹?<br>    灝界榪欎釜鏂規硶鏄彲琛岀殑,浣嗘槸鏈夊嚑涓己鐐?棣栧厛,榪涜緙撳瓨鐨勪唬鐮佸拰姝e父鐨勭畻娉曚唬鐮佷笉鏄樉钁楀垎寮鐨?涓涓被,涓嶄粎璐熻矗榪涜璁$畻,涔熻璐熻矗榪涜緇存姢緙撳瓨鏁版嵁.榪欐牱,瑕佽繘琛屼竴浜涙祴璇曞氨浼氭樉寰楀緢鍥伴毦.姣斿,涓嶈兘鍐欎竴涓祴璇曠▼搴忔潵嫻嬭瘯榪欎釜綆楁硶鎸佺畫鍦拌繑鍥炵浉鍚岀殑鍊?鍥犱負,浠庣浜屾寮濮?緇撴灉閮芥槸鐩存帴浠巆ache涓幏寰椾簡.<br>    鍏舵,褰撶紦瀛樹唬鐮佷笉鍐嶉渶瑕?縐婚櫎瀹冧細鍙樺緱鍥伴毦,鍥犱負瀹冨拰綆楁硶鍧楀湴浠g爜鏄揣瀵嗙粨鍚堝湪涓璧風殑.鎵浠?瑕佹兂鐭ラ亾緙撳瓨鏄惁甯︽潵浜嗗緢楂樼殑鏁堢巼鎻愬崌涔熸槸寰堝洶闅劇殑,鍥犱負涓嶈兘鍐欎竴涓祴璇曠▼搴忔槸鍜岀紦瀛樻暟鎹垎寮鐨?褰撲綘鏀硅繘浜嗕綘鐨勭畻娉?緙撳瓨鏈夊彲鑳藉け鏁?浣嗘槸榪欎釜鏃跺欎綘騫朵笉鐭ラ亾.<br>    絎笁,緙撳瓨浠g爜涓嶈兘琚噸鐢?灝界浠g爜閬典粠浜嗕竴涓櫘閫氱殑妯″紡,浣嗘槸閮芥槸鍦ㄤ竴涓被- PiBinaryDigitsCalculator閲岄潰.<br><br>    鍓嶉潰涓や釜闂閮藉彲浠ラ氳繃鏋勯犱竴涓紦瀛樺寘瑁呭櫒鏉ヨВ鍐?<br><br><strong style="COLOR: #993366">緙撳瓨鍖呰鍣?/strong><br>    閫氳繃浣跨敤Decorator妯″紡,瑕佸垎寮璁$畻浠g爜鍜岀紦瀛樹唬鐮佹槸寰堝鏄撶殑.棣栧厛,瀹氫箟涓涓帴鍙?閲岄潰瀹氫箟鍩烘湰鐨勬柟娉?<br>     <code>public interface BinaryDigitsCalculator {<br><br>  public byte calculateBinaryDigit(final int n);<br>}</code><br>    <br><br>    <span style="COLOR: #ff0000">鐒跺悗瀹氫箟涓や釜瀹炵幇,鍒嗗埆璐熻矗涓や釜浠誨姟:</span><br><code>public class PiBinaryDigitsCalculator<br>  implements BinaryDigitsCalculator {<br><br>  public byte calculateBinaryDigit(final int n) {<br>      return runBBPAlgorithm(n);<br>  }<br><br>  private byte runBBPAlgorithm(final int n) {<br>      // Lengthy routine goes here ...<br>  }<br><br>}<br><br>import java.util.HashMap;<br><br>public class CachingBinaryDigitsCalculator implements<br>BinaryDigitsCalculator {<br><br>  private BinaryDigitsCalculator binaryDigitsCalculator;<br>  private HashMap cache = new HashMap();<br><br>  public CachingBinaryDigitsCalculator(<br>  BinaryDigitsCalculator calculator) {<br>      this.binaryDigitsCalculator = calculator;<br>  }<br><br>  public synchronized byte calculateBinaryDigit(int n) {<br>      final Integer N = new Integer(n);<br>      Byte B = (Byte) cache.get(N);<br>      if (B == null) {<br>          byte b =<br>            binaryDigitsCalculator.calculateBinaryDigit(n);<br>          cache.put(N, new Byte(b));<br>          return b;<br>      } else {<br>          return B.bytevalue();<br>      }<br>  }<br>}</code><br>    <br>    榪欐槸寰堜箣鍓嶇殑瀹炵幇PiBinaryDigitsCalculator鐨勪竴縐嶇畝鍗曠殑refactored鐗堟湰. CachingBinaryDigitsCalculator鍖呰浜咮inaryDigitsCalculator鍙ユ焺,騫跺鍔犱簡緙撳瓨,渚沜alculateBinaryDigit鐨勬柟娉曡皟鐢? 榪欑鏂規硶鎻愰珮浜嗕唬鐮佺殑鍙鎬т笌鍙淮鎶ゆ? 鐢ㄦ埛涓嶈兘鐩存帴浣跨敤BinaryDigitsCalculator鎺ュ彛鏉ュ疄鐜扮畻娉?鎵浠?濡傛灉闇瑕佸叧闂紦瀛樺潡,灝嗘槸寰堝鏄撳疄鐜扮殑.<br>    榪樻湁,鍚堥傜殑嫻嬭瘯紼嬪簭寰堝鏄撳啓鍑烘潵.姣斿,鎴戜滑鍐欎竴涓亣鐨凚inaryDigitsCalculator瀹炵幇,姣忔calculateBinaryDigit琚皟鐢?璧嬩簣鐩稿悓鐨勫弬鏁?榪斿洖涓嶅悓鐨勫? 榪欐牱,鎴戜滑灝辮兘嫻嬭瘯緙撳瓨鏄惁宸ヤ綔浜?鍥犱負濡傛灉姣忔閮借繑鍥炵浉鍚岀殑鍊?鍒欒瘉鏄庣紦瀛樻槸姝e父宸ヤ綔浜? 榪欑嫻嬭瘯鍦ㄤ箣鍓嶉偅縐嶇畝鍗曠殑瀹炵幇鏄笉鍙兘鐨?<br><br>榪欐槸寰堜箣鍓嶇殑瀹炵幇PiBinaryDigitsCalculator鐨勪竴縐嶇畝鍗曠殑refactored鐗堟湰. CachingBinaryDigitsCalculator鍖呰浜咮inaryDigitsCalculator鍙ユ焺,騫跺鍔犱簡緙撳瓨,渚沜alculateBinaryDigit鐨勬柟娉曡皟鐢? 榪欑鏂規硶鎻愰珮浜嗕唬鐮佺殑鍙鎬т笌鍙淮鎶ゆ? 鐢ㄦ埛涓嶈兘鐩存帴浣跨敤BinaryDigitsCalculator鎺ュ彛鏉ュ疄鐜扮畻娉?鎵浠?濡傛灉闇瑕佸叧闂紦瀛樺潡,灝嗘槸寰堝鏄撳疄鐜扮殑.<br><br>    榪樻湁,鍚堥傜殑嫻嬭瘯紼嬪簭寰堝鏄撳啓鍑烘潵.姣斿,鎴戜滑鍐欎竴涓亣鐨凚inaryDigitsCalculator瀹炵幇,姣忔calculateBinaryDigit琚皟鐢?璧嬩簣鐩稿悓鐨勫弬鏁?榪斿洖涓嶅悓鐨勫? 榪欐牱,鎴戜滑灝辮兘嫻嬭瘯緙撳瓨鏄惁宸ヤ綔浜?鍥犱負濡傛灉姣忔閮借繑鍥炵浉鍚岀殑鍊?鍒欒瘉鏄庣紦瀛樻槸姝e父宸ヤ綔浜? 榪欑嫻嬭瘯鍦ㄤ箣鍓嶉偅縐嶇畝鍗曠殑瀹炵幇鏄笉鍙兘鐨勩?br>閫氳繃鍔ㄦ佷唬鐞嗙被鏉ュ垱寤轟竴涓氱敤鐨勭紦瀛樺寘瑁呭櫒\r<br><br>    涓婇潰絎簩縐嶆柟娉曚粎鏈夌殑緙虹偣灝辨槸緙撳瓨鍖呰鍣ㄤ笉鑳介噸鐢?姣忔鎴戜滑甯屾湜娣誨姞涓涓紦瀛樼粰鏌愪釜綾?鎴戜滑灝辮鍐欎竴涓壒孌婄殑緙撳瓨鍖呰鍣ㄧ粰鐩爣鎺ュ彛.榪欐槸涓涓緢鎱?瀹規槗鍑洪敊鐨勮繃紼?<br><br>    Jdk1.3寮濮嬫敮鎸佸姩鎬佷唬鐞嗙被: 鐗瑰埆鐨勭被鑳藉鍦ㄨ繍琛屾湡鍐沖畾瀹炵幇鍝釜鎺ュ彛-閫氬父鐨勬ā寮忛兘鏄?鍦ㄨ繍琛屾湡鍗沖喅瀹氬疄鐜板摢涓帴鍙?閫氳繃榪欎釜,鎴戜滑鏈夊彲鑳藉疄鐜頒竴涓氱敤鐨勭紦瀛樺寘瑁呭櫒,鎴戜滑縐板畠涓篗emoizer,鍦ㄨ繍琛屾湡鍐沖畾瀹炵幇鍝釜鎺ュ彛.榪欐牱, CachingBinaryDigitsCalculator灝辨槸涓嶅啀闇瑕佺殑.瀹冩槸榪欐牱琚皟鐢ㄧ殑:<br><br>BinaryDigitsCalculator calculator =<br>new CachingBinaryDigitsCalculator(<br>new PiBinaryDigitsCalculator()<br>);  <br><br>    鍙互閫氳繃Memoizer鏉ラ噸鍐欏涓?<br><br>BinaryDigitsCalculator calculator =<br>(BinaryDigitsCalculator) Memoizer.memoize(<br>new PiBinaryDigitsCalculator()<br>);<br><br>Memoizer鐨勪唬鐮佸涓?<br></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> demo.proxy;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.lang.reflect.InvocationHandler;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.lang.reflect.InvocationTargetException;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.lang.reflect.Method;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.lang.reflect.Proxy;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Arrays;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Collections;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.HashMap;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.List;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_361_1538_Open_Image onclick="this.style.display='none'; Codehighlighter1_361_1538_Open_Text.style.display='none'; Codehighlighter1_361_1538_Closed_Image.style.display='inline'; Codehighlighter1_361_1538_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_361_1538_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_361_1538_Closed_Text.style.display='none'; Codehighlighter1_361_1538_Open_Image.style.display='inline'; Codehighlighter1_361_1538_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Memorizer </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> InvocationHandler </span><span id=Codehighlighter1_361_1538_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_361_1538_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_409_543_Open_Image onclick="this.style.display='none'; Codehighlighter1_409_543_Open_Text.style.display='none'; Codehighlighter1_409_543_Closed_Image.style.display='inline'; Codehighlighter1_409_543_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_409_543_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_409_543_Closed_Text.style.display='none'; Codehighlighter1_409_543_Open_Image.style.display='inline'; Codehighlighter1_409_543_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> Object memorize(Object object) </span><span id=Codehighlighter1_409_543_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_409_543_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> Proxy.newProxyInstance(object.getClass().getClassLoader(),<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>                object.getClass().getInterfaces(), </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Memorizer(object));<br><img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Object object;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Map caches </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap();<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_643_670_Open_Image onclick="this.style.display='none'; Codehighlighter1_643_670_Open_Text.style.display='none'; Codehighlighter1_643_670_Closed_Image.style.display='inline'; Codehighlighter1_643_670_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_643_670_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_643_670_Closed_Text.style.display='none'; Codehighlighter1_643_670_Open_Image.style.display='inline'; Codehighlighter1_643_670_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Memorizer(Object object) </span><span id=Codehighlighter1_643_670_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_643_670_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.object </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> object;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object invoke(Object proxy, Method method, Object[] args)<br><img id=Codehighlighter1_759_1125_Open_Image onclick="this.style.display='none'; Codehighlighter1_759_1125_Open_Text.style.display='none'; Codehighlighter1_759_1125_Closed_Image.style.display='inline'; Codehighlighter1_759_1125_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_759_1125_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_759_1125_Closed_Text.style.display='none'; Codehighlighter1_759_1125_Open_Image.style.display='inline'; Codehighlighter1_759_1125_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>            </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Throwable </span><span id=Codehighlighter1_759_1125_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_759_1125_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Don't cache void methods</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_839_875_Open_Image onclick="this.style.display='none'; Codehighlighter1_839_875_Open_Text.style.display='none'; Codehighlighter1_839_875_Closed_Image.style.display='inline'; Codehighlighter1_839_875_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_839_875_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_839_875_Closed_Text.style.display='none'; Codehighlighter1_839_875_Open_Image.style.display='inline'; Codehighlighter1_839_875_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (method.getReturnType().equals(Void.TYPE)) </span><span id=Codehighlighter1_839_875_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_839_875_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> invoke(method, args);<br><img id=Codehighlighter1_882_1122_Open_Image onclick="this.style.display='none'; Codehighlighter1_882_1122_Open_Text.style.display='none'; Codehighlighter1_882_1122_Closed_Image.style.display='inline'; Codehighlighter1_882_1122_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_882_1122_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_882_1122_Closed_Text.style.display='none'; Codehighlighter1_882_1122_Open_Image.style.display='inline'; Codehighlighter1_882_1122_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>        }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span id=Codehighlighter1_882_1122_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_882_1122_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            Map cache </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getCache(method);<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            List key </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Arrays.asList(args);<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            Object value </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> cache.get(key);<br><img id=Codehighlighter1_1035_1101_Open_Image onclick="this.style.display='none'; Codehighlighter1_1035_1101_Open_Text.style.display='none'; Codehighlighter1_1035_1101_Closed_Image.style.display='inline'; Codehighlighter1_1035_1101_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1035_1101_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1035_1101_Closed_Text.style.display='none'; Codehighlighter1_1035_1101_Open_Image.style.display='inline'; Codehighlighter1_1035_1101_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (value </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&&</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">cache.containsKey(key)) </span><span id=Codehighlighter1_1035_1101_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1035_1101_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>                value </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> invoke(method, args);<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>                cache.put(key, value);<br><img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>            }</span></span><span style="COLOR: #000000"><br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> value;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>        }</span></span><span style="COLOR: #000000"><br><img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1198_1327_Open_Image onclick="this.style.display='none'; Codehighlighter1_1198_1327_Open_Text.style.display='none'; Codehighlighter1_1198_1327_Closed_Image.style.display='inline'; Codehighlighter1_1198_1327_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1198_1327_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1198_1327_Closed_Text.style.display='none'; Codehighlighter1_1198_1327_Open_Image.style.display='inline'; Codehighlighter1_1198_1327_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Object invoke(Method method, Object[] args) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Throwable </span><span id=Codehighlighter1_1198_1327_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1198_1327_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_1206_1249_Open_Image onclick="this.style.display='none'; Codehighlighter1_1206_1249_Open_Text.style.display='none'; Codehighlighter1_1206_1249_Closed_Image.style.display='inline'; Codehighlighter1_1206_1249_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1206_1249_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1206_1249_Closed_Text.style.display='none'; Codehighlighter1_1206_1249_Open_Image.style.display='inline'; Codehighlighter1_1206_1249_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>        </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id=Codehighlighter1_1206_1249_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1206_1249_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> method.invoke(object, args);<br><img id=Codehighlighter1_1287_1324_Open_Image onclick="this.style.display='none'; Codehighlighter1_1287_1324_Open_Text.style.display='none'; Codehighlighter1_1287_1324_Closed_Image.style.display='inline'; Codehighlighter1_1287_1324_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1287_1324_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1287_1324_Closed_Text.style.display='none'; Codehighlighter1_1287_1324_Open_Image.style.display='inline'; Codehighlighter1_1287_1324_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>        }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (InvocationTargetException e) </span><span id=Codehighlighter1_1287_1324_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1287_1324_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> e.getTargetException();<br><img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>        }</span></span><span style="COLOR: #000000"><br><img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1375_1536_Open_Image onclick="this.style.display='none'; Codehighlighter1_1375_1536_Open_Text.style.display='none'; Codehighlighter1_1375_1536_Closed_Image.style.display='inline'; Codehighlighter1_1375_1536_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1375_1536_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1375_1536_Closed_Text.style.display='none'; Codehighlighter1_1375_1536_Open_Image.style.display='inline'; Codehighlighter1_1375_1536_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> Map getCache(Method m) </span><span id=Codehighlighter1_1375_1536_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1375_1536_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>        Map cache </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Map) caches.get(m);<br><img id=Codehighlighter1_1433_1517_Open_Image onclick="this.style.display='none'; Codehighlighter1_1433_1517_Open_Text.style.display='none'; Codehighlighter1_1433_1517_Closed_Image.style.display='inline'; Codehighlighter1_1433_1517_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1433_1517_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1433_1517_Closed_Text.style.display='none'; Codehighlighter1_1433_1517_Open_Image.style.display='inline'; Codehighlighter1_1433_1517_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (cache </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) </span><span id=Codehighlighter1_1433_1517_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1433_1517_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            cache </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Collections.synchronizedMap(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap());<br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            caches.put(m, cache);<br><img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>        }</span></span><span style="COLOR: #000000"><br><img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> cache;<br><img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"> </span></div> <p><br><br>褰撹皟鐢ㄩ潤鎬佹柟娉昺emoize鐨勬椂鍊?灝嗕細鍒涘緩涓涓柊鐨勪唬鐞嗗疄渚?涔熷氨鏄竴涓猨ava.lang.reflect.proxy鐨勫疄渚?瀹炵幇浜嗕竴涓帴鍙i泦.榪欎釜鎺ュ彛闆嗙敱object.getClass().getInterfaces()鏉ュ喅瀹?姣忎釜浠g悊瀹炰緥鍖呭惈涓涓猨ava.lang.reflect.InvocationHandler瀹炰緥鏉ュ鐞嗚繖涓唬鐞嗗疄渚嬭皟鐢ㄧ殑鐩稿叧鏂規硶.鍦ㄦ垜浠殑渚嬪瓙閲?Memoizer灝辨槸涓涓狪nvocationHandler瀹炰緥.</p> <p>    褰撲竴涓柟娉曞湪浠g悊瀹炰緥閲岃璋冪敤,姣斿, calculateBinaryDigit,閭d箞, Memoizer瀹炰緥閲岀殑invoke鏂規硶灝變細琚皟鐢?鐩稿叧淇℃伅浼氫紶緇檌nvoke鏂規硶,浠ュ喅瀹歱roxy瀹炰緥璋冪敤浜嗗摢涓柟娉?鍖呭惈鍙傛暟淇℃伅.鍦ㄦ垜浠殑渚嬪瓙閲?浼犲叆Memoizer鐨刯ava.lang.Method鍙傛暟鏄痗alculateBinaryDigit,鑰屽弬鏁頒俊鎭垯鏄痯i闇瑕佺簿紜殑浣嶆暟-鏁存暟n.鍦ㄨ繖涓熀紜涓?Memoizer鑳藉榪涗竴姝ヨ繘琛岀紦瀛樻搷浣滅殑.</p> <p>    鍦ㄤ緥瀛愰噷(caches鏄竴涓狧ashmap,cache鏄竴涓猰ap)閲岀敤鍒扮殑Key,涓昏鏄紶鍏ョ殑鏂規硶淇℃伅:Method瀵硅薄鍜屽弬鏁板璞? 涓轟簡瀹炵幇鐨勭畝鍗曚笌閫氱敤鎬?Memoizer鏈変竴涓叧浜巆ache鐨凥ashMap caches,姣忎釜method鏄竴涓猭ey,瀵瑰簲鐨剉alue涓轟竴涓猚ache.鐒跺悗鎶婂弬鏁頒俊鎭漿鍖栨垚涓涓狶ist瀵硅薄,浣滀負cache鐨凨ey.浣跨敤List鏄緢鏂逛究鐨?鍚屾椂涔熷彲浠ヤ繚璇乪quals()鏂規硶,鎵浠ヨ兘澶熶繚璇佸綋涓斾粎褰撳弬鏁頒俊鎭畬鍏ㄧ浉鍚岀殑鏃跺欒繖涓狶ist鎵嶇浉絳?</p> <p>    涓鏃︿竴涓猚ache鐨凨ey琚垱寤?閭d箞,璁$畻涔嬪墠閮戒細鍏堟煡鎵捐繖涓猚ache,濡傛灉鎵懼埌,鍒欒繑鍥瀋ache閲岀殑鍊?鍚﹀垯,濡傛灉甯︽湁榪欎簺鍙傛暟鐨勮繖涓柟娉曟病鏈夎璋冪敤榪?閭d箞,鍒欎細閫氳繃invoke鏉ヨ皟鐢ㄨ繖涓猰ethod.鍦ㄦ垜浠殑渚嬪瓙閲? 瀹炰緥PiBinaryDigitsCalculator 閲岀殑calculateBinaryDigit鏂規硶灝嗕細閫氳繃invoke琚皟鐢?鑰屼笖璁$畻緇撴灉灝嗕細琚瓨鍦╟ache閲?<br>浣曟椂浣跨敤Memoizer</p> <p>    浣滀負涓鏉¢氱敤鐨勮鍒?Memoizer鑳藉鍦ㄤ換浣曢渶瑕佷紶緇熺殑cache鐨勬椂鍊欎嬌鐢?姣斿涓婇潰鎻愬埌鐨勪緥瀛? 鐗瑰埆鍦?鎺ュ彛閲屾瘡涓渶瑕佷嬌鐢ㄨ蹇嗗姛鑳界殑method闇瑕佹弧瓚充笅闈㈠嚑鏉℃潯浠?</p> <p>    1. 榪欎釜method鐨勮繑鍥炲兼渶濂戒笉瑕佹瘡嬈¤皟鐢ㄩ兘浼氭敼鍙榎r</p> <p>    2. 榪欎釜method涓嶈鏈夊壇鏁堝簲</p> <p>    3. 榪欎釜method鐨勫弬鏁版槸紜畾鐨?闈瀖utable鐨?</p> <p>    鏄劇劧,濡傛灉姣忔璋冪敤榪欎釜method榪斿洖鍊奸兘涓嶅悓,閭d箞cache灝辨鏃犵敤澶勪簡.鍚屾牱涔熸槸寰堥噸瑕佺殑涓鐐規槸,鍥犱負鏈夊壇鏁堝簲鐨刴ethod涓嶄細琚噸澶?鎵浠ヨ繖涓猰ethod涓嶈兘鏈夊壇鏁堝簲(method鑷姩鏇存柊鏌愪簺鐘舵?.褰撶劧,void鏂規硶闄ゅ.</p> <p>    鍚屾牱,memorize涓涓甫鏈夋湭瀹?mutable)鍙傛暟鐨刴ethod鏄緢鍗遍櫓鐨?鍥犱負,瑕佹妸榪欎簺鍙傛暟鍌ㄥ瓨鍒癶ashmap閲屼細鏄緢鍗遍櫓鐨勪竴浠朵簨.鏍規嵁Map鐨勫畾涔?褰撹繖涓狹ap閲岀殑key鍙戠敓鏀瑰彉,Map鏄笉鐭ラ亾鐨?鎵浠?褰撲綘鎵ц浜嗕竴嬈¤繖涓猰ethod涔嬪悗,鐩稿叧淇℃伅娣誨姞榪涗簡Map,鐒跺悗鍙傛暟鍙戠敓鍙樺紓(mutate),絎簩嬈¤皟鐢ㄧ殑鏃跺?灝變細寰楀埌閿欒鐨勭粨鏋?</p> <p>    鎬ц兘</p> <p>    浣跨敤cache鐨勪富瑕佺洰鐨勫氨鏄負浜嗘彁鍗囦綘鐨勭▼搴忕殑閫熷害.鐒惰?reflection紜槸浼楁墍鍛ㄧ煡鐨勪綆鏁?鍦╦dk1.4閲屾湁鎵鏀硅繘,閫氳繃reflection璋冪敤鏂規硶鏄櫘閫氳皟鐢ㄩ熷害鐨?/2,榪欎釜姣攋dk1.3瑕佸揩40鍊?.Memoizer涓昏渚濋潬reflection鏉ヨ皟鐢ㄦ柟娉?鎵浠?瀹冪湅涓婂幓騫朵笉鏄竴涓ソ鐨勯斿緞.浣嗘槸,濡傛灉浣跨敤cache鑳界粰紼嬪簭閫熷害甯︽潵鐨勬彁鍗囪繙楂樹簬reflection瀵歸熷害鐨勫獎鍝?閭d箞,浣跨敤Memoizer鏄煎緱鑰冭檻鐨?</p> <p>    鍦ㄦ垜浠PiBinaryDigitsCalculator鐨勬祴璇曚腑,嫻嬭瘯鐜涓簀dk1.4,褰搉灝忎簬10鐨勬椂鍊?浣夸笉浣跨敤cache閫熷害鏄浉褰撶殑.浣嗘槸,褰搉澧炲ぇ鐨勬椂鍊?浣跨敤cache鐨勪紭鍔垮氨寮濮嬫樉紺哄嚭鏉?鎵浠?緇忓父浣跨敤PiBinaryDigitsCalculator鐨勭敤鎴?鍙互鑰冭檻浣跨敤cache.</p> <p>    涓嶅垢鐨勬槸,鍞竴嫻嬭瘯浣犵殑紼嬪簭鏄惁闇瑕乧ache鐨勯斿緞鏄瘮杈冧綘鐨勭▼搴忓湪涓ょ鎯呭喌涓嬬殑榪愯鏁堢巼.灝界濡傛,鍥犱負涓轟竴涓▼搴忔瀯閫犱竴涓猚ache鍖呰鍣ㄦ槸寰堝鏄撶殑涓浠朵簨,縐婚櫎瀹冧篃鏄緢瀹規槗鐨?涓嬮潰鐨勫緩璁彲浠ヤ綔涓轟竴涓弬鑰冪殑姝ラ:</p> <p>    1. 閫夋嫨闇瑕佽蹇嗘搷浣滅殑綾籠r</p> <p>    2. 榪愯瀹僜r</p> <p>    3. 濡傛灉鏁堢巼鏄弧鎰忕殑,go to 6</p> <p>    4. 娣誨姞memoizer,浣跨敤cache</p> <p>    5. 濡傛灉鏁堢巼娌℃湁鏄捐憲鎻愬崌,縐誨垵memoizer</p> <p>    6. 濡傛灉闇瑕?閲嶈瘯.</p> <p>    鐞嗚涓?浣犻渶瑕佸垎鏋愪負涓涓被娣誨姞璁板繂鍔熻兘瀵規暣涓郴緇熺殑褰卞搷.鍙湁浣犺嚜宸辨竻妤氭槸鍚﹀煎緱娣誨姞.鏈変簺鏂規硶,鍗充嬌鏄綆楅噺寰堝ぇ鐨?浣嗘槸鍦ㄨ繖涓郴緇熼噷寰堝皯琚皟鐢?鎵浠?娌″繀瑕佷負瀹冩坊鍔犺蹇嗗姛鑳?涓轟簡淇濊瘉榪欎釜,鎴戝紑鍙戜簡涓涓洿鏈夌壒鐐圭殑Memoizer,瀹炵幇浜嗕竴涓彨鍋欳acheStatistics鐨勬帴鍙?浣犺兘浠庡畠寰楀埌cache鐨勬暟閲忎互鍙婃棤鏁堢殑cache.浣犲彲浠ヤ嬌鐢ㄥ畠浣滀負鍒ゆ柇鐨勪竴涓昂搴?</p> <p>    鎵╁睍Memoizer</p> <p>    淇敼Memoizer綾繪潵鏀寔涓嶅悓鐨刢ache絳栫暐鏄緢綆鍗曠殑.涓涓瘮杈冩櫘閫氱殑綾誨瀷灝辨槸Least-Recently-Used(LRU)cahce,鎷ユ湁鍥哄畾鏁伴噺鐨勫叆鍙?榪欎釜cache紜繚鍏ュ彛涓嶅ぇ浜庡畠鐨勬渶澶ф暟鐩?濡傛灉瓚呰繃,灝辨憭寮冩渶鏃х殑緙撳瓨鏁版嵁.涔熷氨鏄?鑳藉浠巆ache閲屽緱鍒扮殑鏄柊鐨勬暟鎹?涓涓被鍙互浣跨敤LRU cache鏉ラ槻姝竴涓▼搴忛暱鏈熶繚鎸佷竴涓姸鎬?浣犲彲浠ヤ粎浠呬紶閫掍竴涓弬鏁扮粰CacheFactory閲岀殑memoize鏂規硶鏉ラ夋嫨浣犻渶瑕佺殑cache綾誨瀷.涓嬮潰鐨勪緥瀛?LRU cache鏈澶氭湁1000涓叆鍙?</p> <p>BinaryDigitsCalculator calculator =<br>(BinaryDigitsCalculator) Memoizer.memoize(<br>new PiBinaryDigitsCalculator(),<br>new LruCacheFactory(1000)<br>); </p> <p>    鍗充嬌鏄繖涔堢畝鍗?Memoizer涔熷簲璇ユ槸java紼嬪簭鍛樹竴涓湁鐢ㄧ殑宸ュ叿.</p> <img src ="http://www.tkk7.com/dyerac/aggbug/132037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/dyerac/" target="_blank">dyerac in java...</a> 2007-07-24 14:03 <a href="http://www.tkk7.com/dyerac/archive/2007/07/24/132037.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>XML,RPC,RMI,SOAP,WSDL,RESR,Web Services Relationshttp://www.tkk7.com/dyerac/archive/2007/07/24/132004.htmldyerac in java...dyerac in java...Tue, 24 Jul 2007 03:10:00 GMThttp://www.tkk7.com/dyerac/archive/2007/07/24/132004.htmlhttp://www.tkk7.com/dyerac/comments/132004.htmlhttp://www.tkk7.com/dyerac/archive/2007/07/24/132004.html#Feedback0http://www.tkk7.com/dyerac/comments/commentRss/132004.htmlhttp://www.tkk7.com/dyerac/services/trackbacks/132004.htmlRMI   is   object   based   protocal   which   you   can   serialize   your   object   and   make   a   remote   call   on   object   thru   it.

XMLRPC   is   message   (XML)   based   and   you   can   not   use   object   at   all.   The   advantage   is   security   and   reliability.   With   XML   you   can   encrypt   and   validate   any   way   you   like.   SOAP   is   XMLRPC   on   HTTP   by   XML   message



]]>
瀹氫箟鑷繁鐨勭儹閿?/title><link>http://www.tkk7.com/dyerac/archive/2007/07/24/132002.html</link><dc:creator>dyerac in java...</dc:creator><author>dyerac in java...</author><pubDate>Tue, 24 Jul 2007 03:06:00 GMT</pubDate><guid>http://www.tkk7.com/dyerac/archive/2007/07/24/132002.html</guid><wfw:comment>http://www.tkk7.com/dyerac/comments/132002.html</wfw:comment><comments>http://www.tkk7.com/dyerac/archive/2007/07/24/132002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/dyerac/comments/commentRss/132002.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/dyerac/services/trackbacks/132002.html</trackback:ping><description><![CDATA[<p>* 涓涓嬌鐢↘eyStroke鑷畾涔夊揩鎹烽敭鐨勭ず渚?br> * <br>*/<br>public class MnemonicT extends JFrame {<br> private int count = 0;</p> <p> private JButton button;</p> <p> public MnemonicT() {<br>  super("Mnemonic Test");<br>  JPanel panel = new JPanel();<br>  panel.setPreferredSize(new Dimension(320, 240));<br>  panel.setLayout(new FlowLayout());</p> <p>  button = new JButton(new AbstractAction("ClickTimes:" + count) {<br>   public void actionPerformed(ActionEvent e) {<br>    button.setText("ClickTimes:" + (++count));<br>   }<br>  });<br>  panel.add(button);<br>  add(panel);</p> <p>  InputMap im = button.getInputMap(JButton.WHEN_IN_FOCUSED_WINDOW);<br>  im.put(KeyStroke.getKeyStroke("control A"), "buttonAction"); // 鎸塁TRL+A<br>  button.getActionMap().put("buttonAction", button.getAction());<br>  pack();<br>  setDefaultCloseOperation(EXIT_ON_CLOSE);<br> }</p> <p> public static void main(String[] args) {<br>  SwingUtilities.invokeLater(new Runnable() {<br>   public void run() {<br>    new MnemonicT().setVisible(true);<br>   }<br>  });<br> }<br>}</p> <img src ="http://www.tkk7.com/dyerac/aggbug/132002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/dyerac/" target="_blank">dyerac in java...</a> 2007-07-24 11:06 <a href="http://www.tkk7.com/dyerac/archive/2007/07/24/132002.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>錛坺t錛塧nnotation relationshttp://www.tkk7.com/dyerac/archive/2007/07/22/131760.htmldyerac in java...dyerac in java...Sun, 22 Jul 2007 14:42:00 GMThttp://www.tkk7.com/dyerac/archive/2007/07/22/131760.htmlhttp://www.tkk7.com/dyerac/comments/131760.htmlhttp://www.tkk7.com/dyerac/archive/2007/07/22/131760.html#Feedback1http://www.tkk7.com/dyerac/comments/commentRss/131760.htmlhttp://www.tkk7.com/dyerac/services/trackbacks/131760.html闃呰鍏ㄦ枃

]]>
瀛︿範璁″垝http://www.tkk7.com/dyerac/archive/2007/07/19/131329.htmldyerac in java...dyerac in java...Thu, 19 Jul 2007 09:57:00 GMThttp://www.tkk7.com/dyerac/archive/2007/07/19/131329.htmlhttp://www.tkk7.com/dyerac/comments/131329.htmlhttp://www.tkk7.com/dyerac/archive/2007/07/19/131329.html#Feedback2http://www.tkk7.com/dyerac/comments/commentRss/131329.htmlhttp://www.tkk7.com/dyerac/services/trackbacks/131329.html    鐜板湪寮濮嬪涔犲暒錛屽垪涓皬灝忕殑璁″垝鍚э細
    璁烘枃闃呰璁″垝錛歊EST錛?Blueprint 4 mashup錛?J2EE Clustering
    妗嗘灦瀛︿範璁″垝錛欰pache CXF錛?Dom4J錛?DB4O錛孉spectJ
    鍩虹瀛︿範璁″垝錛歑ML
    璇█瀛︿範璁″垝錛欽avascript錛孭ython
   
   閲嶇偣瀛︿範璁″垝錛欰jax錛孯EST錛學eb Services


欏轟究鎬葷粨涓嬭繖鍑犲ぉ鐪嬬殑鍑犱釜鍚嶈瘝錛?br>
REST錛?br>Atom錛?br>Feed錛?br>SOAP錛?br>WSDL錛?br>JSON錛?br>Mashup錛?

]]>
Editplus閰嶇疆http://www.tkk7.com/dyerac/archive/2007/07/17/130884.htmldyerac in java...dyerac in java...Tue, 17 Jul 2007 08:48:00 GMThttp://www.tkk7.com/dyerac/archive/2007/07/17/130884.htmlhttp://www.tkk7.com/dyerac/comments/130884.htmlhttp://www.tkk7.com/dyerac/archive/2007/07/17/130884.html#Feedback1http://www.tkk7.com/dyerac/comments/commentRss/130884.htmlhttp://www.tkk7.com/dyerac/services/trackbacks/130884.html1. 浠ql涓轟緥錛岄渶瑕乻ql.stx(璇硶)  sql.acp錛坅uto completement錛夋斁鍒癳ditplus鐩綍涓嬪嵆鍙?br>2. 鍙﹀淇敼settings.ini絳夊嚑涓猧ni鏂囦歡錛堜富瑕佹槸閽堝acp鏂囦歡錛?br>3. 騫跺惎鍔╡ditplus鐢╰ool宸ュ叿瀵煎叆stx鏂囦歡 騫惰緗珮浜煋鑹叉柟妗堬紙alert錛佹垜鍙彂鐜頒簡瀵煎叆 娌℃壘鍒版墜宸ヤ慨鏀圭殑鏂?nbsp;
    娉曪級
4. 鍒涘緩template.sql鏂囦歡 騫朵慨鏀箃emplate.ini 娉ㄦ剰 涔熻淇敼ini涓樉紺虹殑妯℃澘鏁扮洰錛堣岄潪浠呬粎娣誨姞錛?br>5. that's all

]]>
主站蜘蛛池模板: 亚洲黄色免费电影| 一级特级aaaa毛片免费观看| 亚洲成a人片在线看| 99re免费99re在线视频手机版| 亚洲综合av一区二区三区| 亚洲AV永久无码天堂影院| 国产黄色免费观看| 女人与禽交视频免费看| 欧美激情综合亚洲一二区| 日本无吗免费一二区| 一级特黄录像视频免费| 久久久久一级精品亚洲国产成人综合AV区 | 又大又硬又爽又粗又快的视频免费| 黄页网站在线免费观看| 无码少妇一区二区浪潮免费| 国产v亚洲v天堂无码网站| 国产精品久久久久久亚洲影视| 亚洲一卡二卡三卡| 日韩亚洲综合精品国产| 中文字幕在线亚洲精品| 国产精品手机在线亚洲| 亚洲中文无韩国r级电影| 中文精品人人永久免费| 亚洲AV人无码综合在线观看| 最近免费mv在线电影| 亚洲国产精品无码久久久秋霞1| 久久国产精品免费网站| 国产亚洲精品精华液| 日韩在线视频播放免费视频完整版| 一出一进一爽一粗一大视频免费的| 88av免费观看| 亚洲国产精品18久久久久久| 久久国产成人精品国产成人亚洲| 亚洲天堂2017无码中文| 全黄a免费一级毛片人人爱| 国产精品免费大片| 亚洲精品无码一区二区 | 亚洲成年人电影网站| 成人午夜18免费看| 亚洲日本天堂在线| 国产午夜亚洲精品午夜鲁丝片|