黑马程序员技术交流社区

标题: 暴力反射——单例不再是单例 [打印本页]

作者: 陈磊    时间: 2011-7-29 14:47
标题: 暴力反射——单例不再是单例
看完老师的反射这一章节,第一感觉想到是单例,即利用反射来生成新的单实例,下面是实现的代码:

一个普通的 UserManager 单例[code=java]package com.itcast.heima;

public class UserManager {

        private static UserManager instance = new UserManager();
       
        private UserManager() {
               
        }
       
        public static UserManager getInstance() {
                return instance;
        }
}[/code]通过反射生成不同的单实例:[code=java]package com.itcast.heima;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Date;

public class Test1 {

        /**
         * @param args
         */
        public static void main(String[] args)throws Exception {
                Constructor constuctor = UserManager.class.getDeclaredConstructor();
                constuctor.setAccessible(true);
                UserManager userManager1 = (UserManager)constuctor.newInstance();

                UserManager userManager2 = UserManager.getInstance();
                UserManager userManager3 = UserManager.getInstance();

                System.out.println(userManager2 == userManager3); //它们是同一个实例
                System.out.println(userManager1 == userManager2); //它们是不同实例
        }

}[/code]问题:有什么方法能保证单例是真正唯一的单实例而不让其它程序通过反射途径获取到新的单例呢
作者: 匿名    时间: 2011-7-29 14:59
加个final………试试
作者: 匿名    时间: 2011-7-29 17:41
恩~这个一般情况下没有办法吧,真正唯一的单例,除非限制了这个类只产生唯一的对象吧,不知道对不对~:lol




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2