java invoke 反射機制實現演練

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();         }     } }
代碼和解釋都是自己一個個敲出來的,如果大家覺得有用就請頂一下吧。

發佈了27 篇原創文章 · 獲贊 46 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章