黑马程序员技术交流社区
标题:
关于单例的使用
[打印本页]
作者:
sunalong
时间:
2013-7-15 17:36
标题:
关于单例的使用
本帖最后由 杨兴庭 于 2013-7-16 17:49 编辑
我知道单例的两个创建方式:
//饿汉式
class Single{
private Single(){} //私有化构造函数。
private static Single s = new Single(); //创建私有并静态的本类对象。
public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
return s;
}
}
---------------------------------------------
//懒汉式:延迟加载方式。
class Single2{
private Single2(){}
private static Single2 s = null;
public static Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}
复制代码
但在程序内部是怎么被调用的?
今天吃饭时问同学一个问题是关于反射的,他当时就说单例什么的内部是用反射调用的,我当时喝的头都大了,
没仔细问,所以现在问一下、、
作者:
木、易m
时间:
2013-7-15 17:40
单例不需要用到反射吧,单例只是对构造函数进行私有化,然后再建个静态方法返回该对象的就行啦,根本不需要用到反射呀
作者:
孙金鑫
时间:
2013-7-15 18:03
我说一下我的理解,有可能片面,但确实可以实现:
单例设计模式,最核心的思想就是不能创建对象,所有的内容都是通过类名调用,保证其唯一性。
但是,如果用到反射技术,单例的这种不能创建对象唯一性的特性,将会被打破。
例如:利用反射,获取单例设计模式的私有化构造函数,然后创建新的对象,完全可以实现。
因此,单例设计模式(如:楼主所列出的饿汉式,懒汉式)只是一个最基本的雏形,若要保证其唯一性,在实用过程中,需要加入诸多判断,来保证其唯一性。方式有好多种,至于如何实现,就自己找找吧。
作者:
云游天下
时间:
2013-7-15 18:06
饿汉式(先初始化对象,Single类一进内存就创建好了对象)
懒汉式(延时加载 Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象)
具体过程包括:
<1> 将构造函数私有化
<2> 在类中创建一个本类对象
<3> 提供一个方法可以获取到该对象
懒汉模式主要作用是保证在Java应用程序中,一个类Class只有一个实例在。
使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回(garbage collection)。
作者:
黄基焜
时间:
2013-7-15 21:15
用反射打破单例只能用暴力反射(普通反射是不能打破私有,只能用暴力)
但是你用到暴力反射的话,无论你怎么封装都没用,除了自定义类加载器加密类以外
如果用自定义类加载器加密加载类,你的类要给别人用,对应的类加载器还是也要给别人用
别人还是可以暴你的类加载器,继而暴你的封装类.
作者:
无气打火机
时间:
2013-7-15 22:27
单例模式其实用反射可以打破的,也就是单例模式的安全性也没有用,因为反射可以直接打破。下面给楼主看下反射式如何打破单例的
package cn.itcast.reflect1;
import java.lang.reflect.Constructor;
public class Test {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Class cls = Class.forName("cn.itcast.reflect1.Single");//获取单例的字节码文件
Constructor con = cls.getDeclaredConstructor();//返回构造函数因为单例是私有的构造函数,所以需要强行获取
con.setAccessible(true);//强行获取
Object obj = con.newInstance();//利用构造函数创建对象
System.out.println(obj);//输出对象的哈希值
Object obj2 = con.newInstance();//在获取一个对象
System.out.println(obj2);//输出对象哈希值
/*
* 两个哈希值是不相等的,所以单例也可以打破的,用反射
*/
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2