我做了一个单例模式的类,用于测试。
class Single{
private static Single onlyOne = null;
static{
onlyOne = new Single();
}
private Single(){
super();
}
public static Single getMe(){
return onlyOne;
}
}
测试类main方法的类
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test {

public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class cls = Single.class;
Constructor con = cls.getDeclaredConstructor(null);
con.setAccessible(true);
Object first = con.newInstance(null);
Object second = con.newInstance(null);
System.out.println(first);
System.out.println(second);
}}
使用什么方法可以禁止别人反射我的private构造方法,从而使得当别人懂得类的反射机制时,也能保证我的实体类在内存中只有一个对象?望高手指教。谢谢

解决方案 »

  1.   

    没有什么好办法,因为反射的某些地方绕过了java机制的限制,private只在编译时进行权限的限制,但是在运行时是不存在这种权限的限制的,这些权限的限制是由运行时的安全机制来检查,但是这种安全很脆弱。
    但是有一个非常有用的方式来解决这个问题,就是你把单例类定义为抽象类,这样别人就算用反射也不能实例化,然后在类的工厂方法内部实现一个匿名内部类来继承单例类返回单例类实例,顺便说一句,这种方式同样可以用一些非常规手段实现多个实例,不过过程要麻烦很多。
    总结一句,安全很多时候都是相对的,只要够用就好,而且单例模式的精神在于编写代码时的代码控制而不是对运行安全性的限制,工厂方法也是同样。