因為Spring在加載類的實例時,我們知道其實是用工廠的方式,給出一個個實例,而在工廠里面,用了單例,但是真正實例化,則是反射的newInstance來創建對象,而不是new。
那么,為什么是反射的newInstance,而不是new呢?
那么首先我們必須明白,Java里面,反射的目的是什么?
高內聚,低耦合。
進一步,反射比new的好處是什么?
反射不用知道類名,可以直接實例化類,也就是不用硬編碼。
有人問了,不知道類名那怎么反射呢?
例子:
通過new,我們這么寫:
A a = New A();
通過反射,我們這么寫:
Class c = Class.forName(“A”);
factory = (AInterface)c.newInstance();
其中AInterface是類A的接口,如果下面這樣寫,你可能會理解:
String className = “A”;
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();
進一步,如果下面寫,你可能會理解:
String className = readfromXMlConfig;//從xml 配置文件中獲得字符串
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();
上面代碼就消滅了A類名稱,優點:無論A類怎么變化,上述代碼不變,甚至可以更換A的兄弟類B , C , D….等,只要他們繼承Ainterface就可以。
所以可以總結個答案:
反射可以不用類名實例化對象,並且降低耦合,避免了硬編碼。