1、Java 反射技術 Java反射技術應用廣泛,它能夠配置:類的全限定名、方法和參數,完成對象的初始化,甚至是反射某些方法。這樣可以大大增強Java的可配置性,如Spring IoC 的基本原理也是反射,當然Spring IoC 的代碼要復炸得多,還有其他的技術結合。 Java 的反射內容繁多, ...
1、Java 反射技術
Java反射技術應用廣泛,它能夠配置:類的全限定名、方法和參數,完成對象的初始化,甚至是反射某些方法。這樣可以大大增強Java的可配置性,如Spring IoC 的基本原理也是反射,當然Spring IoC 的代碼要復炸得多,還有其他的技術結合。
Java 的反射內容繁多, 包括對象的構建、反射方法、註解、參數、介面等。這次主要講一下對象的構建和反射的方法。在Java中,反射是通過包java.lang.reflect.* 來實現的。
2、通過反射構建對象
在Java中允許通過反射配置信息構造對象。
首先創建一個對象:
package com.hhh.learn.reflect; /** * 對象 * @author chao * */ public class ReflectServiceImpl { private String name; //不帶參的構造方法 public ReflectServiceImpl(){} //帶參構造方法 public ReflectServiceImpl(String name){ this.name = name; } public void sayHello(String name){ System.out.println("Hello!" + name); } public void sayHello(){ System.out.println("Hello!" + name); } }
然後通過反射方法去構造這個對象,如下代碼:
//不帶參 public ReflectServiceImpl getInstance(){ ReflectServiceImpl object = null; try{ object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").newInstance(); }catch(Exception e){ e.printStackTrace(); } return object; }
這裡的代碼就可以利用反射去構造了一個 ReflectServiceImpl 對象。其實利用反射方法構造對象就是給類載入器註冊了一個類的全限定名,再通過 newInstance() 的方法來初始化一個對象。
若要構造帶參的對象,可以查看以下代碼:
public ReflectServiceImpl getInstance2(){ ReflectServiceImpl object = null; try{ object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").getConstructor(String.class).newInstance("張三"); }catch(Exception e){ e.printStackTrace(); } return object; }
先通過 forName()的方法將類載入到載入器中,再通過 getConstructor()方法選擇哪一個構造方法,最後通過 newInstance() 的方法來初始化一個對象。
3、反射方法
再上面我們已經構造了對象,就可以調用他們的方法了,代碼如下:
ReflectServiceImpl object = null; try{ object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").newInstance(); Method method = object.getClass().getMethod("sayHello", String.class); method.invoke(object, "李四"); }catch(Exception e){ e.printStackTrace(); }
對象構造好,通過 getClass() 的方法獲取對應的對象, 再通過 getMethod()方法獲取對應的方法,裡面填調用的方法名和參數的類型, 最後就調用 invoke() 方法執行對應的方法,裡面要寫明對象和參數的值。通過這樣就可以利用反射的方式去調用方法了。
4、反射的優點和缺點
反射的優點:只要配置就可以生成對象,可以解除程式的耦合度,比較靈活,大大增強的可配置性和可擴展性。
反射的缺點:運行比較慢。