java中的反射,invoke方法

invoke,就是經過函數名反射調用相應的函數。如下代碼簡單地介紹了java反射中invoke方法java

package org.curry.tool;
import java.lang.reflect.Method;
public class InvokeMethods {
public static void main(String[] args) {
  Employee emp = new Employee();
  Class cl = emp.getClass();//是Class,而不是class
  // getClass得到emp對象所屬的類型的對象,Class就是描述類的類          
  // Class是專門用來描述類的類,好比描述某個類有那些字段,方法,構造器等等!
  try {
   // getMethod方法第一個參數指定一個須要調用的方法名稱,這裏是Employee類的setAge方法,
   // 第二個參數是須要調用方法的參數類型列表,是參數類型!如無參數能夠指定null或者省略 
   // 該方法返回一個方法對象 
   //參數必須和方法中同樣,int和Integer,double和Double被視爲不一樣的類型
   Method sAge = cl.getMethod("setAge", new Class[] { int.class });
   Method gAge = cl.getMethod("getAge", null);
   Method pName = cl.getMethod("printName", new Class[] { String.class });
   Object[] args1 = { new Integer(25) };
   // invoke方法中,第二個參數爲參數列表,該參數列表是一個object[]數組
   // emp爲隱式參數該方法不是靜態方法必須指定
   sAge.invoke(emp, args1);//經過setter方法賦值
   Integer AGE = (Integer) gAge.invoke(emp, null);//經過getter方法返回值
   int age = AGE.intValue();//Integer轉換成int
   System.out.println("The Employee Age is: " + age);
   Object[] args3 = { new String("Jack") };
   pName.invoke(emp, args3);
  } catch (Exception e) {
   e.printStackTrace();
  }
  System.exit(0);
 }
}
class Employee {
 // 定義一個員工類  
 public Employee() {
  age = 0;
  name = null;
 }
 // 將要被調用的方法  
 public void setAge(int a) {
  age = a;
 }
 // 將要被調用的方法  
 public int getAge() {
  return age;
 }
 // 將要被調用的方法
 public void printName(String n) {
  name = n;
  System.out.println("The Employee Name is: " + name);
 }
 private int age;
 private String name;
}

項目代碼:數組

/**
 *利用keyName來對以search做爲查詢條件的結果集進行過濾
 /
public Map<Object, T> getMap(Search search,String keyName){
	List<T> entities=this.getBaseDao().search(search, DaoParam.SEARCH_OPTION_NORMAL);
	Map<Object, T> map=new LinkedHashMap<Object, T>();
	//經過參數keyName得到get方法名,好比getName,getAge
	String methodName="get"+keyName.substring(0,1).toUpperCase()+keyName.substring(1);
	for(T entity:entities){
		Object key=null;
		try {
		        //getter方法不須要參數
			Method method=entity.getClass().getMethod(methodName);
			//反射調用方法
			key=method.invoke(entity);
			if(key instanceof BasePojo){
			        //若是getter方法返回的是BasePojo類,那麼以該BasePojo的id做爲key
			        key=((BasePojo<?>)key).getId();
			}
			map.put(key, entity);

			} catch (Exception e) {
				logger.error(e,e);
			} 
		}
		entities=null;
		return map;
	}
相關文章
相關標籤/搜索