反射技術對單例模式的挑戰之一道變態的面試題

来源:互联网 发布:北大网络教育简单么 编辑:程序博客网 时间:2024/05/22 13:16

朋友參加面試歸來,跟我說遇到的一面試題,說:利用反射技術可否調用單例模式類的私有構造函數得到其實例?
我想了想,記得做單元測試的時候測私有方法曾用反射調過,答曰:可
又問:如何處理?
答:。。。。。。。
比較無語,我真沒這麼考慮過這個問題。
於是,我寫了個單例模式的類做了下測試,代碼(Java版)如下:
public class Singleton {
private static int flag = 0;
private static Singleton instance = new Singleton();
private Singleton(){
System.out.println("Inited...");
flag +=2;
}
public static Singleton getInstance(){
return instance;
}
public String getString(){
return String.valueOf(flag);
}
}



public class PrivateAccess {
public static void main(String[] args) throws Exception, NoSuchMethodException {
Class<?> singletonClass = Singleton.class;
Constructor<?> method = singletonClass.getDeclaredConstructor();
method.setAccessible(true);
Singleton instance = (Singleton)method.newInstance();
System.out.println(instance.getString());

}
結果為:4
--------------------------------------------------------------------------------------------------------------------
後來我想,哪個工程師敢這麼寫,那就把這工程師拉出來開批鬥會吧。
如果有其他答案,歡迎不吝賜教。
--------------------------------------------------------------------------------------------------------------------

C#版:
 public class Singleton
    {
        private static Singleton instance = new Singleton();
        private static int flag = 0;
        private Singleton()
        {
            flag += 2;
        }
        public static Singleton getInstance()
        {
            return instance;
        }
        public string getString()
        {
            return flag.ToString();
        }
    }

}

class Program
    {
        static void Main(string[] args)
        {
            Singleton singleton = (Singleton)Activator.CreateInstance(typeof(Singleton), true);
            Console.WriteLine(singleton.getString());
        }
    }
結果為:2

原创粉丝点击