锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲视频一区调教,久久久久亚洲AV无码专区网站 ,久久久久亚洲av成人无码电影http://m.tkk7.com/dyerac/category/13594.htmldyerac 鐨勫ぉ澶╁ぉ钃?/description>zh-cnTue, 14 Aug 2007 16:19:02 GMTTue, 14 Aug 2007 16:19:02 GMT60鎵嬪姩鍒涘緩涓涓柊Classhttp://m.tkk7.com/dyerac/archive/2007/08/13/136473.htmldyerac in java...dyerac in java...Mon, 13 Aug 2007 10:52:00 GMThttp://m.tkk7.com/dyerac/archive/2007/08/13/136473.htmlhttp://m.tkk7.com/dyerac/comments/136473.htmlhttp://m.tkk7.com/dyerac/archive/2007/08/13/136473.html#Feedback0http://m.tkk7.com/dyerac/comments/commentRss/136473.htmlhttp://m.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>

]]>
鍔ㄦ佷唬鐞?Dynamic Proxy錛塉ava Servlet http://m.tkk7.com/dyerac/archive/2007/07/24/132051.htmldyerac in java...dyerac in java...Tue, 24 Jul 2007 07:10:00 GMThttp://m.tkk7.com/dyerac/archive/2007/07/24/132051.htmlhttp://m.tkk7.com/dyerac/comments/132051.htmlhttp://m.tkk7.com/dyerac/archive/2007/07/24/132051.html#Feedback0http://m.tkk7.com/dyerac/comments/commentRss/132051.htmlhttp://m.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://m.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://m.tkk7.com/dyerac/archive/2007/07/24/132037.html</guid><wfw:comment>http://m.tkk7.com/dyerac/comments/132037.html</wfw:comment><comments>http://m.tkk7.com/dyerac/archive/2007/07/24/132037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/dyerac/comments/commentRss/132037.html</wfw:commentRss><trackback:ping>http://m.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://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> demo.proxy;<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_409_543_Open_Text><span style="COLOR: #000000">{<br><img src="http://m.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://m.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://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.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://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.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://m.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://m.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://m.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://m.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_643_670_Open_Text><span style="COLOR: #000000">{<br><img src="http://m.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://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.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://m.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://m.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://m.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_759_1125_Open_Text><span style="COLOR: #000000">{<br><img src="http://m.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://m.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://m.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://m.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_839_875_Open_Text><span style="COLOR: #000000">{<br><img src="http://m.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://m.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://m.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://m.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_882_1122_Open_Text><span style="COLOR: #000000">{<br><img src="http://m.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://m.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://m.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://m.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://m.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://m.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1035_1101_Open_Text><span style="COLOR: #000000">{<br><img src="http://m.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://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>                cache.put(key, value);<br><img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>            }</span></span><span style="COLOR: #000000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> value;<br><img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>        }</span></span><span style="COLOR: #000000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://m.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://m.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://m.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://m.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://m.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://m.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://m.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1206_1249_Open_Text><span style="COLOR: #000000">{<br><img src="http://m.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://m.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://m.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://m.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1287_1324_Open_Text><span style="COLOR: #000000">{<br><img src="http://m.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://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>        }</span></span><span style="COLOR: #000000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://m.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://m.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://m.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://m.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1375_1536_Open_Text><span style="COLOR: #000000">{<br><img src="http://m.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://m.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://m.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://m.tkk7.com/Images/dot.gif"></span><span id=Codehighlighter1_1433_1517_Open_Text><span style="COLOR: #000000">{<br><img src="http://m.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://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>            caches.put(m, cache);<br><img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>        }</span></span><span style="COLOR: #000000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> cache;<br><img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://m.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://m.tkk7.com/dyerac/aggbug/132037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/dyerac/" target="_blank">dyerac in java...</a> 2007-07-24 14:03 <a href="http://m.tkk7.com/dyerac/archive/2007/07/24/132037.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>瀹氫箟鑷繁鐨勭儹閿?/title><link>http://m.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://m.tkk7.com/dyerac/archive/2007/07/24/132002.html</guid><wfw:comment>http://m.tkk7.com/dyerac/comments/132002.html</wfw:comment><comments>http://m.tkk7.com/dyerac/archive/2007/07/24/132002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/dyerac/comments/commentRss/132002.html</wfw:commentRss><trackback:ping>http://m.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://m.tkk7.com/dyerac/aggbug/132002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/dyerac/" target="_blank">dyerac in java...</a> 2007-07-24 11:06 <a href="http://m.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://m.tkk7.com/dyerac/archive/2007/07/22/131760.htmldyerac in java...dyerac in java...Sun, 22 Jul 2007 14:42:00 GMThttp://m.tkk7.com/dyerac/archive/2007/07/22/131760.htmlhttp://m.tkk7.com/dyerac/comments/131760.htmlhttp://m.tkk7.com/dyerac/archive/2007/07/22/131760.html#Feedback0http://m.tkk7.com/dyerac/comments/commentRss/131760.htmlhttp://m.tkk7.com/dyerac/services/trackbacks/131760.html闃呰鍏ㄦ枃

]]>
Editplus閰嶇疆http://m.tkk7.com/dyerac/archive/2007/07/17/130884.htmldyerac in java...dyerac in java...Tue, 17 Jul 2007 08:48:00 GMThttp://m.tkk7.com/dyerac/archive/2007/07/17/130884.htmlhttp://m.tkk7.com/dyerac/comments/130884.htmlhttp://m.tkk7.com/dyerac/archive/2007/07/17/130884.html#Feedback0http://m.tkk7.com/dyerac/comments/commentRss/130884.htmlhttp://m.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

]]>
Ant鍗佷簲澶у簲鐢?杞?http://m.tkk7.com/dyerac/archive/2006/12/05/85591.htmldyerac in java...dyerac in java...Tue, 05 Dec 2006 07:38:00 GMThttp://m.tkk7.com/dyerac/archive/2006/12/05/85591.htmlhttp://m.tkk7.com/dyerac/comments/85591.htmlhttp://m.tkk7.com/dyerac/archive/2006/12/05/85591.html#Feedback0http://m.tkk7.com/dyerac/comments/commentRss/85591.htmlhttp://m.tkk7.com/dyerac/services/trackbacks/85591.html闃呰鍏ㄦ枃

]]>
鑷繁鍋氱殑澶氬姛鑳借綆楀櫒錛屽樋鍢?/title><link>http://m.tkk7.com/dyerac/archive/2006/11/24/dollyCal.html</link><dc:creator>dyerac in java...</dc:creator><author>dyerac in java...</author><pubDate>Fri, 24 Nov 2006 10:24:00 GMT</pubDate><guid>http://m.tkk7.com/dyerac/archive/2006/11/24/dollyCal.html</guid><wfw:comment>http://m.tkk7.com/dyerac/comments/83344.html</wfw:comment><comments>http://m.tkk7.com/dyerac/archive/2006/11/24/dollyCal.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://m.tkk7.com/dyerac/comments/commentRss/83344.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/dyerac/services/trackbacks/83344.html</trackback:ping><description><![CDATA[     鎽樿: 鏈夋劅浜巜indows鑷甫璁$畻鍣ㄧ殑涓嶅ソ浣?鏈榪戝績琛鏉ユ疆鎸夎嚜宸遍渶姹傚紑鍙戜簡涓涓鍔熻兘璁$畻鍣ㄣ傚叾鏍稿績鐨勪竴閮ㄥ垎鏉ヨ嚜浜庣綉涓婄殑瀛︿範璧勬枡錛屽洜姝ゆ垜涔熶笉鏁㈢钘忎唬鐮侊紝鐗規嬁鍑烘潵鍜屽ぇ瀹跺垎浜績寰椼?<br> 璁$畻鍣ㄥ姛鑳藉涓嬶細 <br> 1.鏀寔榪愯鏃舵洿鎹㈢晫闈㈢毊鑲わ紝姘村嵃鍜屾寜閽艦鐘剁瓑澶栬鏄劇ず銆?<br> 2.鏀寔sin, cos, tan, cot, arcsin, arccos, arctan, arccot, !, log, ln, +, -, *, /, %, 涔樻柟絳夊熀鏈繍綆楋紝鏀寔榪炵畫榪愮畻騫? <br> 鑷甫PI錛孍鐨勭簿紜箋?<br> 3.鏀寔琛ㄨ揪寮忚綆楋紝鏀寔璁劇疆鍙橀噺錛屽彲浠ヨ交鏉劇殑瀹炵幇鍏紡榪愮畻銆?<br> 4.鏃犻檺鐨勭粨鏋滀繚瀛橈紝瀹屽叏瀵圭敤鎴烽忔槑錛岀敤鎴峰彲浠ヨ交鏉劇殑瀛樺偍鍜岃鍙栧厛鍓嶇殑鎿嶄綔緇撴灉. <br> 5.鑳藉鍒嗘瀽鐢ㄦ埛鎿嶄綔灝ゅ叾鏄〃杈懼紡涓殑璇硶閿欒錛屾彁閱掔敤鎴瘋屼笉鏄繑鍥為敊璇粨鏋溿?nbsp; <a href='http://m.tkk7.com/dyerac/archive/2006/11/24/dollyCal.html'>闃呰鍏ㄦ枃</a><img src ="http://m.tkk7.com/dyerac/aggbug/83344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/dyerac/" target="_blank">dyerac in java...</a> 2006-11-24 18:24 <a href="http://m.tkk7.com/dyerac/archive/2006/11/24/dollyCal.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>B/S瀹炵幇榪滅▼閰嶇疆SVNhttp://m.tkk7.com/dyerac/archive/2006/10/21/76578.htmldyerac in java...dyerac in java...Sat, 21 Oct 2006 14:30:00 GMThttp://m.tkk7.com/dyerac/archive/2006/10/21/76578.htmlhttp://m.tkk7.com/dyerac/comments/76578.htmlhttp://m.tkk7.com/dyerac/archive/2006/10/21/76578.html#Feedback4http://m.tkk7.com/dyerac/comments/commentRss/76578.htmlhttp://m.tkk7.com/dyerac/services/trackbacks/76578.html鐜板湪鎻愪緵鐨勫姛鑳芥湁錛?
涓洪」鐩垱寤簊vn浠撳簱錛屼慨鏀箂vn璐︽埛瀵嗙爜錛屼慨鏀箂vn鏉冮檺閰嶇疆絳夈?nbsp; 闃呰鍏ㄦ枃

]]>
Collection瀛︿範絎旇http://m.tkk7.com/dyerac/archive/2006/07/30/60899.htmldyerac in java...dyerac in java...Sun, 30 Jul 2006 14:34:00 GMThttp://m.tkk7.com/dyerac/archive/2006/07/30/60899.htmlhttp://m.tkk7.com/dyerac/comments/60899.htmlhttp://m.tkk7.com/dyerac/archive/2006/07/30/60899.html#Feedback0http://m.tkk7.com/dyerac/comments/commentRss/60899.htmlhttp://m.tkk7.com/dyerac/services/trackbacks/60899.html
1.ArrayList瀹為檯涓婂簲璇ユ槸鏁扮粍瀹炵幇,鎵浠ヤ笉鏂逛究鍋氬ぇ閲忕殑鍒犻櫎鍜屾坊鍔?浣嗘槸寰堟湁鏁堜笌get(),set()鏂規硶
聽聽 LinkedList鏄熀浜庨摼琛ㄥ疄鐜?鎵浠ヤ笉搴旇鐢ㄤ綔闅忔満璁塊棶,浣嗘槸add(),remove()鏂規硶寰堥傜敤

2.add(),remove()鏂規硶浼氱牬鍧忛泦鍚堢殑緇撴瀯,鎵浠ュ湪鐢ㄤ袱涓嚎紼嬭闂椂浼氬嚭鐜板悓姝ラ棶棰?浣嗘槸set()(鏀瑰彉涔嬪墠璁塊棶鐨勫?涓嶄細.

3.vector鍜宎rraylist閮芥槸鍩轟簬鏁扮粍瀹炵幇鐨?瀹冧滑鐨勫尯鍒湪浜?vector鏄悓姝ョ殑,浼氭秷鑰楁洿澶氱殑璧勬簮,鎵浠ヤ笉闇瑕佸悓姝ユ椂,鏈濂戒嬌鐢╝rraylist
聽 鍚屾牱鐨勪緥瀛愯繕鏈塇ashtable(鍚屾)鍜孒ashMap

4.闆嗗悎鐨勬煇浜涙搷浣滀細鏈塨oolean鐨勮繑鍥炲?璇ュ艱〃紺烘槸鍚︽敼鍙樹簡闆嗗悎鐨勭粨鏋?姣斿add).鐢辨鍙互鍒ゆ柇鎿嶄綔鏄惁鎴愬姛

5.HashSet涓嶈兘瀛樻斁鐩稿悓鐨勫厓绱? 鑰屼笖鏄棤搴忓瓨鏀劇殑. TreeSet鎻愪緵浜嗘帓搴忕殑鏂規硶,鍙互璁╁厓绱犺嚜韜疄鐜癈omparable鎺ュ彛,鎴栬?涓篢reeSet鍒跺畾鐗規畩鐨勬帓搴忕被Comparator

6. PriorityQueue鎻愪緵浜嗛珮鏁堢殑寰楀埌鏈灝忓厓绱犵殑鏂規硶,榪欐湁鍔╀簬瀹炵幇浠誨姟璋冨害鍣ㄧ被浼肩殑鍔熻兘

7.Map鐨刱eySet, entrySet, values鍙互璁塊棶鍜屽垹闄ら敭鍊兼垨鑰呴敭鍚?浣嗘槸涓嶈兘澧炲姞.澧炲姞鐨勮瘽蹇呴』鐩存帴璋冪敤Map鐨勬柟娉?鍚屾牱,Map涓浉鍚岀殑鍏冪礌鍙兘鏈変竴涓敭鍚?br />
8.WeakHashMap鍙互鎶妋ap涓笉鍐嶉渶瑕佺殑鍏冪礌鐢眊c鍥炴敹

9.LinkedHashSet鍜孡inkedHashMap鎻愪緵浜嗘帓搴忕殑鏂規硶,浣嗘槸榪欎釜鎺掑簭鏄彲浠ユ帶鍒剁殑,accessOrder涓簍rue鏃舵槸鎸夌収璁塊棶鐨勯『搴忚繘琛岀殑,涓篺alse鏃舵槸鎸夌収浣犵殑杈撳叆欏哄簭

10.IdientityHashMap閫氳繃鍐呭瓨鍦板潃璁$畻hascode,鍥犳鍙互鎷ユ湁鐩稿悓鐨勫厓绱?鍥犱負瀹冧腑闂寸殑姣旇緝鏄氳繃"=="鑰屼笉鏄痚quals

11.Collections綾繪彁渚涗簡涓緋誨垪鎿嶄綔Collection鎺ュ彛鐨勬柟娉曞拰綆楁硶, 姣斿浜屽垎鏌ユ壘, 鎺掑簭絳夌瓑(璇鋒敞鎰廋ollections鍜孋ollection鐨勫尯鍒?

12.瑙嗗浘鎶鏈?
聽聽聽 榪欐槸闆嗗悎妗嗘灦涓欏瑰嚭鑹茬殑鎶鏈? 瀵逛簬鐜版湁闆嗗悎鐨勬搷浣? 姣斿璇撮夊彇瀛愰泦, 鐢辮闆嗗悎浜х敓鐗規畩闆嗗悎絳夌瓑,瀹為檯涓婇兘娌℃湁鍒涘緩鏂扮殑闆嗗悎,鑰屾槸鍦ㄥ師鏈夐泦鍚堜笂鍒涘緩瑙嗗浘,璇ヨ鍥炬槸瀹炵幇浜咰ollection鎺ュ彛鐨勭壒孌婂疄鐜扮被,鐢ㄦ埛瀵硅繖浜涚被鐨勮皟鐢ㄥ疄闄呬笂榪樻槸瀵硅鍏跺寘瑁圭殑鍘熸湁闆嗗悎鐨勮皟鐢? 瑙嗗浘瀹為檯涓婅搗鍒頒簡鐨勪唬鐞嗙殑浣滅敤
聽聽 鍥犳,瑙嗗浘鐨勯棶棰樺湪浜庨氳繃瑙嗗浘浣犳湁鏃舵棤娉曡皟鐢ㄦ帴鍙g殑鎵鏈夋柟娉?姣斿List.asList(Array a)鍙互鎶婃暟緇勫寘瑁規垚鍒楄〃,浣嗗疄闄呬笂,鎴戜滑鐨勬搷浣滆繕鏄洿鎺ヤ紶鍒頒簡鏁扮粍涔嬩腑.鍥犳,瀵逛簬榪欐牱鐨勫垪琛? 鎵鏈夌殑鏇存敼緇撴瀯鐨勬柟娉?濡俛dd, remove)閮戒笉琚敮鎸?(浠f祴楠?

]]>
鐢↙ook And Feel鎵撻犵粴涓界殑鐣岄潰澶栬錛?/title><link>http://m.tkk7.com/dyerac/archive/2006/04/03/38986.html</link><dc:creator>dyerac in java...</dc:creator><author>dyerac in java...</author><pubDate>Mon, 03 Apr 2006 10:18:00 GMT</pubDate><guid>http://m.tkk7.com/dyerac/archive/2006/04/03/38986.html</guid><wfw:comment>http://m.tkk7.com/dyerac/comments/38986.html</wfw:comment><comments>http://m.tkk7.com/dyerac/archive/2006/04/03/38986.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/dyerac/comments/commentRss/38986.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/dyerac/services/trackbacks/38986.html</trackback:ping><description><![CDATA[     鎽樿: 铏界劧鎴戜滑鐭ラ亾錛屼竴涓闈㈠簲鐢ㄧ▼搴忕殑濂藉潖錛屽拰瀹冪殑鎬ц兘錛屽姛鑳芥湁鐫寰堝ぇ鍏崇郴錛?<br>鐒惰岋紝瀵逛簬澶у鏁板潗鍦ㄧ數鑴戝墠鐨勭敤鎴瘋岃█錛屼粬浠殑鏍囧噯寰寰鏄? 緇氫附鐨勫瑙?<br>MVC璁捐涓嬬殑鐨凷WING鑷劧娌℃湁蹇借榪欎竴鐐?閫氳繃瀵筓IManager鐨勮緗?鍜岀涓夋柟鐨勭被搴?<br>鎴戜滑鍙互寰堝鏄撶殑鏀瑰彉搴旂敤紼嬪簭鐨勫瑙?<br>  <a href='http://m.tkk7.com/dyerac/archive/2006/04/03/38986.html'>闃呰鍏ㄦ枃</a><img src ="http://m.tkk7.com/dyerac/aggbug/38986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/dyerac/" target="_blank">dyerac in java...</a> 2006-04-03 18:18 <a href="http://m.tkk7.com/dyerac/archive/2006/04/03/38986.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鐢╦ava鎵撻犱換鎰忓艦鐘剁獥鍙e拰閫忔槑紿楀彛http://m.tkk7.com/dyerac/archive/2006/04/03/38984.htmldyerac in java...dyerac in java...Mon, 03 Apr 2006 10:15:00 GMThttp://m.tkk7.com/dyerac/archive/2006/04/03/38984.htmlhttp://m.tkk7.com/dyerac/comments/38984.htmlhttp://m.tkk7.com/dyerac/archive/2006/04/03/38984.html#Feedback6http://m.tkk7.com/dyerac/comments/commentRss/38984.htmlhttp://m.tkk7.com/dyerac/services/trackbacks/38984.html闃呰鍏ㄦ枃

]]>
主站蜘蛛池模板: 最近免费字幕中文大全视频 | a毛片基地免费全部视频| 最新国产AV无码专区亚洲| 天天综合亚洲色在线精品| 免费被黄网站在观看| 精品国产成人亚洲午夜福利| 精品久久8x国产免费观看| 18gay台湾男同亚洲男同| 无码国产精品一区二区免费3p| 久久精品国产亚洲av麻| 亚洲午夜免费视频| 91亚洲国产在人线播放午夜 | 亚洲综合久久综合激情久久| 久久久久久久岛国免费播放| 亚洲人成影院在线| 麻豆一区二区免费播放网站 | 一级女人18片毛片免费视频| 国产中文字幕免费观看| 国产精品久久久久久亚洲影视| 国产一区二区三区无码免费| 成年免费a级毛片| 亚洲国产精品成人精品无码区在线 | a在线视频免费观看在线视频三区| 午夜一区二区免费视频| 日本黄页网址在线看免费不卡 | 午夜亚洲福利在线老司机| 久久精品免费大片国产大片| 亚洲AV无码一区二区二三区入口 | 亚洲乱码无人区卡1卡2卡3| 国产精品国产免费无码专区不卡| 国产精品亚洲专区无码不卡| JLZZJLZZ亚洲乱熟无码| 999久久久免费精品播放| 中文字幕乱码亚洲精品一区| 亚洲国产精品成人一区| 久久免费区一区二区三波多野| 涩涩色中文综合亚洲| 亚洲乳大丰满中文字幕| 三年片在线观看免费观看高清电影 | 欧洲亚洲综合一区二区三区| 亚洲人成网站在线观看青青|