1反射機制是什麼
反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。
2運用原理
在web轉發時候可以根據前臺傳來的ServiceId 和 ServiceAction去尋找所對應的服務和方法名。從而尋找到處理業務邏輯的具體Service和具體方法實現去執行。
實戰演練
package invoke;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/***
* java 反射機制實戰
* @author Administrator
*
*/
public class TestIvoke {
public void doSomething(Map<String, Object> name1,String name2,Object name3){
System.out.println("doSomething");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//第一步 先得到TestIvoke 類的class 或者cls = TestIvoke.class
Class cls = TestIvoke.class ;
// Class.forName("TestIvoke");
//模擬傳入的參數
Map<String, Object> name1 = new HashMap<String, Object>();
String name2 = new String();
Object name3 = new Object();
//用來存放三個參數
List<Object> params = new ArrayList<Object>();
params.add(name1);
params.add(name2);
params.add(name3);
//用來存放三個參數的類型
List<Class<?>> parameterTypes = new ArrayList<Class<?>>();
Iterator<Object> it = params.iterator();
while (it.hasNext()) {
Object object = it.next();
if(object instanceof Map){//由於上面定義了name1 爲HashMap 類型 這邊要強制
parameterTypes.add(Map.class);
}else{
parameterTypes.add(object.getClass());
}
}
System.out.println(parameterTypes.toArray(new Class<?>[parameterTypes.size()])[1]);
//獲得medhod class中的具體方法
Method method = cls.getDeclaredMethod("doSomething",
parameterTypes.toArray(new Class<?>[parameterTypes.size()]));
try {
//methon反射 構建新對象,傳入參數
//或者 method.invoke( new TestIvoke() , params.toArray(new Object[params.size()]));
method.invoke(new TestIvoke(), params.toArray(new Object[params.size()]));
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最後輸出爲
doSomething
將反射機制應用於工廠模式
* 對於普通的工廠模式當我們在添加一個子類的時候,就需要對應的修改工廠類。 當我們添加很多的子類的時候,會很麻煩。 package net.xsoftlab.baike; interface fruit { public abstract void eat(); } class Apple implements fruit { public void eat() { System.out.println("Apple"); } } class Orange implements fruit { public void eat() { System.out.println("Orange"); } } class Factory { public static fruit getInstance(String ClassName) { fruit f = null; try { f = (fruit) Class.forName(ClassName).newInstance(); } catch (Exception e) { e.printStackTrace(); } return f; } } /** * 對於普通的工廠模式當我們在添加一個子類的時候,就需要對應的修改工廠類。 當我們添加很多的子類的時候,會很麻煩。 * Java 工廠模式可以參考 * http://baike.xsoftlab.net/view/java-factory-pattern * * 現在我們利用反射機制實現工廠模式,可以在不修改工廠類的情況下添加任意多個子類。 * * 但是有一點仍然很麻煩,就是需要知道完整的包名和類名,這裏可以使用properties配置文件來完成。 * * java 讀取 properties 配置文件 的方法可以參考 * http://baike.xsoftlab.net/view/java-read-the-properties-configuration-file * * @author xsoftlab.net */ public class TestReflect { public static void main(String[] args) throws Exception { fruit f = Factory.getInstance("net.xsoftlab.baike.Apple"); if (f != null) { f.eat(); } } }代碼和解釋都是自己一個個敲出來的,如果大家覺得有用就請頂一下吧。