Java中finalize()的另类用法

Javafinalize()的另类用法,做过JAVA编程的都知道,在JAVA中有一种垃圾收集器的机制,当它运行时(通常在系统内存低到一定限度时自动运行),会回收不再使用的对象所占用的内存,所以,在JAVA程序中,我们通常只考虑创建对象,而从不关心对象的清除。Finalize()是JAVA为类提供的一种特殊方法。

成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、网站制作、永福网络推广、重庆小程序开发公司、永福网络营销、永福企业策划、永福品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联为所有大学生创业者提供永福建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com

垃圾收集器的工作过程大致是这样的:一旦垃圾收集器准备好释放无用对象占用的存储空间,它首先调用那些对象的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:

 
 
 
  1. package com;
  2. public class user {
  3. public String name="";
  4. public String sessionId="";
  5. }

另一个类(testSession)用于处理用户的login、logout等动作信息,使系统可以跟踪当前连接的用户信息。

 
 
 
  1. package com;
  2. import java.util.Vector;
  3. import com.user;
  4. public class testSession {
  5. public user User;
  6. private Vector vsid;
  7. public testSession()
  8. {
  9. User=new user();
  10. }
  11. public boolean verify(String username,String password)
  12. throws Exception //验证用户/密码
  13. {
  14. return true;
  15. }
  16. public void setSessionVar(String sesid,Vector sid) {
  17. this.User.sessionId=sesid;
  18. this.vsid=sid;
  19. }
  20. private static synchronized void addappses(user puser,
  21. Vector pvsid) { //记录一个新连接的用户
  22. int pos=-1;
  23. user l_user;
  24. if (puser==null || pvsid==null)
  25. return;
  26. for(int i=0;i
  27. l_user=(user)pvsid.get(i);
  28. if(l_user.sessionId.equals(puser.sessionId)){
  29. pos=i;
  30. break;
  31. }
  32. }
  33. if(pos==-1){
  34. pvsid.add(puser);
  35. }
  36. else{
  37. pvsid.set(pos,puser);
  38. }
  39. }
  40. private static synchronized void removeappses(user puser,
  41. Vector pvsid) { //移除一个退出的用户
  42. int pos=-1;
  43. user l_user;
  44. if (puser==null || pvsid==null)
  45. return;
  46. for(int i=0;i
  47. l_user=(user)pvsid.get(i);
  48. if(l_user.sessionId.equals(puser.sessionId)){
  49. pos=i;
  50. break;
  51. }
  52. }
  53. if(pos!=-1){
  54. pvsid.remove(pos);
  55. }
  56. }
  57. protected void finalize() {
  58. this.removeappses(this.User,this.vsid);
  59. }
  60. public boolean login(String username) throws Exception
  61. { //处理登录
  62. this.User.name=username;
  63. this.addappses(this.User,this.vsid);
  64. return true;
  65. }
  66. public boolean logout() throws Exception
  67. { //处理注销
  68. this. finalize();
  69. this.User=null;
  70. this.vsid=null;
  71. return true;
  72. }
  73. }

每一个用户均建立一个testSession对象,来保存该用户的信息。为了对类testSession进行说明,必须同时引人另一个文件logintest.jsp。这个用于示例的JSP文件提供一个简单的界面进行登录、注销处理。文件内容如下:

 
 
 
  1. <%@ page import=" com.testSession,
  2. java.util.Vector"%>
  3. <%@page contentType="text/html;charset=GBK" %>
  4. <% request.setCharacterEncoding(response.
  5. getCharacterEncoding());%>
  6. <%
  7. String actionType=request.getParameter("actiontype");
  8. String actionResult="";
  9. if(actionType!=null) {
  10. if(actionType.equals("login")){ // -1-
  11. String userName=request.getParameter("username");
  12. if(userName==null || userName.equals("")){
  13. ;
  14. }
  15. else{
  16. String password=request.getParameter("password");
  17. if(password==null)
  18. password="";
  19. testSession ts=
  20. (testSession)session.getAttribute("testSession");
  21. if(ts!=null) { //-1.1-
  22. session.removeAttribute("testSession");
  23. if( !ts.User.name.equals(""))
  24. ts.logout();
  25. }
  26. ts=new testSession();
  27. if(!ts.verify(userName,password)) {
  28. //验证用户与密码,看是否合法用户
  29. actionResult="login fail";
  30. //非法用户,显示错误信息
  31. }
  32. else{ //验证成功
  33. session.setAttribute("testSession",ts);
  34. Vector app_vts=
  35. (Vector)application.getAttribute("app_vts");
  36. if(app_vts==null) {
  37. app_vts=new Vector();
  38. application.setAttribute("app_vts",app_vts);
  39. }
  40. ts.setSessionVar(session.getId(),app_vts);
  41. ts.login(userName);
  42. actionResult=userName+" login success";
  43. }
  44. }
  45. }
  46. if(actionType.equals("logout")){
  47. testSession ts=
  48. (testSession)session.getAttribute("testSession");
  49. if(ts!=null) {
  50. session.removeAttribute("testSession");
  51. if( !ts.User.name.equals("")){ //-2-
  52. actionResult=ts.User.name;
  53. ts.logout();
  54. }
  55. session.invalidate();
  56. }
  57. actionResult=actionResult+" logout success";
  58. }
  59. }
  60. else
  61. actionResult="null";
  62. %>

新闻标题:Java中finalize()的另类用法
文章网址:http://www.shufengxianlan.com/qtweb/news37/102637.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联