Java中finalize()的另类用法

开发 后端
finalize,法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。本文主要介绍finalize()另类用法,一起来看。

Javafinalize()的另类用法,做过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="";  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

 

另一个类(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;  
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.

 

每一个用户均建立一个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";  
%> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.

 

 

【编辑推荐】

  1. C#执行Finalize方法
  2. 26.5.1 Finalize方法
  3. 4.6.8 对象析构与finalize方法
  4. 4.5.1.3 finalize()在该对象垃圾回收前调用
责任编辑:于铁 来源: 帮考网
相关推荐

2010-11-23 11:16:35

MySQL表别名

2010-08-02 16:10:06

DB2数据库

2012-03-09 10:02:29

Java

2009-03-30 09:39:04

观察者思想换位设计模式

2015-03-13 09:30:23

iOS内存管理

2010-03-24 08:34:44

OSGiJava模块化

2015-09-25 10:58:20

2024-03-07 13:30:44

Java对象true

2009-10-23 17:10:27

试用达人

2020-03-10 18:53:16

移动支付另类支付APP

2009-09-07 10:37:32

C#执行Finaliz

2011-12-01 10:55:34

2009-03-09 13:59:22

IDC行业

2009-09-09 16:06:08

对象

2012-06-15 17:50:26

2023-05-11 16:47:21

playwright用法程序

2009-06-26 16:15:04

Criteria的用法Hibernate

2009-06-18 10:07:03

CriteriaHibernate

2009-12-25 09:54:56

linuxfdisk

2010-05-21 13:34:53

MySQL数据库
点赞
收藏

51CTO技术栈公众号