您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Java的finalize()方法怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java的finalize()方法怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
Java中finalize()的另類用法,做過JAVA編程的都知道,在JAVA中有一種垃圾收集器的機制,當它運行時(通常在系統內存低到一定限度時自動運行),會回收不再使用的對象所占用的內存,所以,在JAVA程序中,我們通常只考慮創建對象,而從不關心對象的清除。Finalize()是JAVA為類提供的一種特殊方法。
垃圾收集器的工作過程大致是這樣的:一旦垃圾收集器準備好釋放無用對象占用的存儲空間,它首先調用那些對象的finalize()方法,然后才真正回收對象的內存。通過使用finalize(),就可以在垃圾收集器運行期間進行一些特殊的工作。下面一例就說明了finalize()的一種巧妙用法。
現在的商業應用系統越來越多的采用WEB形式。在WEB形式應用中,每一次頁面訪問是獨立的,前后不相關聯,哪怕多個用戶在同一時刻訪問應用的同一個頁面,用戶相互之間也是不知道的。如果想要檢查當前有哪些用戶正在使用系統(如準備恢復數據備份或進行系統升級時,系統管理員都很希望知道這些信息),該怎么辦呢? 基于Servlet、Jsp技術的WEB服務器提供了隱含的Session、Application對象,利用它可以幫開發者實現一些信息的持續保存和共享。當用戶訪問一個WEB應用時,WEB服務器會自動創建一個Session對象,該對象可以供用戶在會話期內在應用的所有頁面中共享數據; Application是WEB應用的一個全局對象。利用Session、Application對象,可以達到跟蹤所有用戶信息的目的。
當用戶打開瀏覽器開始請求WEB應用的登錄頁面時,WEB服務即為該客戶創建一個session,此后,在session的timeout時間內,該客戶都使用這個session(timeout時間可設置,如Tomcat服務器是在各應用的web.xml文件中設置)。如果使用IE瀏覽器, Session與客戶IP地址、客戶程序進程ID所共同標識的連接有對應關系,相同IP地址、相同進程的窗口(如通過IE-文件-新建-窗口打開的新窗口)具有同一個session,所以session可用于標識各個獨立的客戶應用連接。
下面是一個樣例:
為了方便處理,先建一個簡單類(user)用來表達用戶信息及存放sessionId:
package com; public class user { public String name=""; public String sessionId=""; }
另一個類(testSession)用于處理用戶的login、logout等動作信息,使系統可以跟蹤當前連接的用戶信息。
package com; import java.util.Vector; import com.user; public class testSession { public user User; private Vector vsid; public testSession() { User=new user(); } public boolean verify(String username,String password) throws Exception //驗證用戶/密碼 { return true; } public void setSessionVar(String sesid,Vector sid) { this.User.sessionId=sesid; this.vsid=sid; } private static synchronized void addappses(user puser, Vector pvsid) { //記錄一個新連接的用戶 int pos=-1; user l_user; if (puser==null || pvsid==null) return; for(int i=0;i l_user=(user)pvsid.get(i); if(l_user.sessionId.equals(puser.sessionId)){ pos=i; break; } } if(pos==-1){ pvsid.add(puser); } else{ pvsid.set(pos,puser); } } private static synchronized void removeappses(user puser, Vector pvsid) { //移除一個退出的用戶 int pos=-1; user l_user; if (puser==null || pvsid==null) return; for(int i=0;i l_user=(user)pvsid.get(i); if(l_user.sessionId.equals(puser.sessionId)){ pos=i; break; } } if(pos!=-1){ pvsid.remove(pos); } } protected void finalize() { this.removeappses(this.User,this.vsid); } public boolean login(String username) throws Exception { //處理登錄 this.User.name=username; this.addappses(this.User,this.vsid); return true; } public boolean logout() throws Exception { //處理注銷 this. finalize(); this.User=null; this.vsid=null; return true; } }
每一個用戶均建立一個testSession對象,來保存該用戶的信息。為了對類testSession進行說明,必須同時引人另一個文件logintest.jsp。這個用于示例的JSP文件提供一個簡單的界面進行登錄、注銷處理。文件內容如下:
<%@ page import=" com.testSession, java.util.Vector"%> <%@page contentType="text/html;charset=GBK" %> <% request.setCharacterEncoding(response. getCharacterEncoding());%> <% String actionType=request.getParameter("actiontype"); String actionResult=""; if(actionType!=null) { if(actionType.equals("login")){ // -1- String userName=request.getParameter("username"); if(userName==null || userName.equals("")){ ; } else{ String password=request.getParameter("password"); if(password==null) password=""; testSession ts= (testSession)session.getAttribute("testSession"); if(ts!=null) { //-1.1- session.removeAttribute("testSession"); if( !ts.User.name.equals("")) ts.logout(); } ts=new testSession(); if(!ts.verify(userName,password)) { //驗證用戶與密碼,看是否合法用戶 actionResult="login fail"; //非法用戶,顯示錯誤信息 } else{ //驗證成功 session.setAttribute("testSession",ts); Vector app_vts= (Vector)application.getAttribute("app_vts"); if(app_vts==null) { app_vts=new Vector(); application.setAttribute("app_vts",app_vts); } ts.setSessionVar(session.getId(),app_vts); ts.login(userName); actionResult=userName+" login success"; } } } if(actionType.equals("logout")){ testSession ts= (testSession)session.getAttribute("testSession"); if(ts!=null) { session.removeAttribute("testSession"); if( !ts.User.name.equals("")){ //-2- actionResult=ts.User.name; ts.logout(); } session.invalidate(); } actionResult=actionResult+" logout success"; } } else actionResult="null"; %>
讀到這里,這篇“Java的finalize()方法怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。