java的反射機制就是增加程序的靈活性,避免將程序寫死到代碼裏, 例如: 實例化一個 person()對象, 不使用反射, new person(); 如果想變成 實例化 其他類, 那麼必須修改源代碼,並重新編譯。 使用反射: class.forName("person").newInstance(); 而且這個類描述可以寫到配置文件中,如 **.xml, 這樣如果想實例化其他類,只要修改配置文件的"類描述"就可以了,不需要重新修改代碼並編譯。 增加程序的靈活性。 如struts中。請求的派發控制。 當請求來到時。struts通過查詢配置文件。找到該請求對應的action。已經方法。 然後通過反射實例化action。並調用響應method。 如果不適用反射,那麼你就只能寫死到代碼裏了。 所以說,一個靈活,一個不靈活。 很少情況下是非用反射不可的。大多數情況下反射是爲了提高程序的靈活性。 因此一般框架中使用較多。因爲框架要適用更多的情況。對靈活性要求較高。
創建對象的3中方式:
使用new的方式,最爲常見。
使用對象的clone()方法。
使用反射機制的newInstance()方法。
舉個簡單的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package com.java; public class Demo { /** * 通過兩種方式創建對象,以做對比。 * @param args * @throws ClassNotFoundException * @throws InstantiationException * @throws IllegalAccessException */ public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { // 我們認爲這種方方式,Demo類和Basic類是耦合的, // 編譯Demo類時,Basic類必須存在,拓展性不強。 Basic basic0 = new Basic(); // 很明顯這種方式,在編譯Demo類時,並不需要 // Basic類的存在,只要在運行Demo類時,存在即可, // 所以我們認爲Demo類和Basic是鬆耦合的, // 爲後期的拓展提供了空間,好處顯而易見。這麼說,如果沒有 // 反射機制,就沒有struts、spring、hibernate等等這些web框架。 Class clazz = Class.forName( "com.java.Basic" ); Basic basic1 = (Basic) clazz.newInstance(); } } |
轉:http://zhidao.baidu.com/question/478254128.html