Java反射調用多種類型的方法總結
本例主要實現的功能有
1、沒有參數的方法2、一個參數的方法,沒有返回值的方法
3、多個參數的方法
4、參數為數組的方法
* 5、參數為集合的方法
* 6、返回值為數組的方法
下面直接來例子package com.mine.practice.reflectMethod;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
- 補充說明
- 一個方法中的參數為print(Object ... objects),
- printf(String ... strings)等方法這樣形式的時候有兩種傳遞參數的方法
- a、Object[] objects = {1,2,3,"23"};
- print(objects);
- b、print(1,2,3,4,"23");
- 注意:
- 一個方法中只能出現一次這樣的形式,Object ... objects,而且這個必須是最后的那個位置。
- 使用反射調用類中的方法
- 本例主要實現的功能有
- 1、沒有參數的方法
- 2、一個參數的方法,沒有返回值的方法
- 3、多個參數的方法
- 4、參數為數組的方法
- 5、參數為集合的方法
- 6、返回值為數組的方法
- @author 2014-11-5 上午10:51:28
- @version V1.0
- @modify by user: {修改人} 2014-11-5
@modify by reason:{方法名}:{原因}
*/
@SuppressWarnings({ "finally", "rawtypes" })
public class TestReflectMethod {
class User{
/**普通形式*/
String name = "defalutName";
/**數組的形式 */
String[] nameArray;
/**集合的形式*/
List<String> list;
/**
* 1、沒有參數的方法
* @author 2014-11-7 上午11:00:46
* @return
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public String getName() {
return name;
}
/***
* 2、一個參數的方法,沒有返回值的方法
* @author 2014-11-7 上午11:01:17
* @param name
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public void setName(String name) {
this.name = name;
}
/**
* 3、多個參數的方法
*
* @author 2014-11-7 上午10:59:28
* @param name
* @param id
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public void print(String name, Integer id) {
System.out.println("id: " + id +" name: " +name);
}
/***
* 4、參數為數組的方法
* @author 2014-11-7 上午11:01:58
* @param nameArray
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public void setNameArray(String[] nameArray) {
this.nameArray = nameArray;
}
/**
* 5、參數為集合的方法
* @author 2014-11-7 上午11:03:26
* @param list
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public void setList(List<String> list) {
this.list = list;
}
/**
* 6、返回值為數組的方法
* @author 2014-11-7 上午11:04:08
* @return
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public String[] getNameArray() {
return nameArray;
}
public List<String> getList() {
return list;
}
}
/**
調用對象的方法
- @author 2014-11-8 上午11:17:46
- @param object 要操作的對象
- @param methodName 方法名稱
- @param parameterClasses 參數的Class數組
- @param methodParameters 具體的方法參數值
- @return 方法調用后返回的對象,如果沒有返回值則為null
- @modificationHistory=========================邏輯或功能性重大變更記錄
- @modify by user: {修改人} 2014-11-8
- @modify by reason:{原因}
*/
private static Object invokeMethod(Object object,String methodName,Object[] methodParameters,Class ... parameterClasses){
Object result = null;
try {
//參數為null的情況底層已經處理了
//獲取某個類的方法時,有多個參數的時候使用new Class[]{}數組的形式
Method method = object.getClass().getMethod(methodName, parameterClasses);
//調用某個類的方法時,有多個參數的時候或者參數為集合或數組的時候,參數值必須使用new Object[]{}數組的形式傳遞進去。
result = method.invoke(object, methodParameters);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}finally{
return result;
}
}
@SuppressWarnings("unchecked")
public static void main(String[] args) throws SecurityException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
TestReflectMethod testReflectMethod = new TestReflectMethod();
/0、實例化內部類對象*/
User user = testReflectMethod.new User();
/*1、沒有參數的方法/
String name = (String)invokeMethod(user,"getName", null);
System.out.println("1、沒有參數有返回值的方法 name: "+name);
String param = "Tom";
/*2、有一個參數且沒有返回值的方法/
Object noReturn = invokeMethod(user,"setName" , new Object[]{param},String.class);
System.out.println("2、有一個參數但沒有返回值的方法,則調用后返回值為null "+noReturn);
/*3、多個參數的方法/
Object noReturnObject = invokeMethod(user,"print",new Object[]{"Name_2",2},new Class[]{String.class,Integer.class});
System.out.println("3、多個參數的方法 "+noReturnObject);
/*4、參數為數組的方法/
String[] arrString = { "A", "B" };
//這個警告是因為方法中的參數使用的是...的形式。這個如果使用("A","B")的形式就不會出現了.
//當參數為數組或者集合的時候必須使用new Object[]{}的方式
invokeMethod(user, "setNameArray",new Object[]{arrString}, String[].class);
System.out.println("4、參數為數組的方法");
/*5、參數為集合的方法/
List<String> list = new ArrayList<String>();
list.add("list1");
list.add("list2");
//先添加進去值
invokeMethod(user,"setList", new Object[]{list},List.class);
//獲取值
List<String> returnList = (List<String>)invokeMethod(user,"getList",null);
System.out.println("5、參數為集合的方法"+returnList.toString());
/*6、返回值為數組的方法/
//返回的為Object所以需要強制轉換
String[] returnStringArray = (String[])invokeMethod(user,"getNameArray",null);
System.out.println("6、返回值為數組的方法"+returnStringArray.length);
}
}</pre></h2>
來自:http://blog.csdn.net/baidu_18607183/article/details/40920355
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List;
/**
@modify by reason:{方法名}:{原因} */ @SuppressWarnings({ "finally", "rawtypes" }) public class TestReflectMethod {
class User{
/**普通形式*/
String name = "defalutName";
/**數組的形式 */
String[] nameArray;
/**集合的形式*/
List<String> list;
/**
* 1、沒有參數的方法
* @author 2014-11-7 上午11:00:46
* @return
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public String getName() {
return name;
}
/***
* 2、一個參數的方法,沒有返回值的方法
* @author 2014-11-7 上午11:01:17
* @param name
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public void setName(String name) {
this.name = name;
}
/**
* 3、多個參數的方法
*
* @author 2014-11-7 上午10:59:28
* @param name
* @param id
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public void print(String name, Integer id) {
System.out.println("id: " + id +" name: " +name);
}
/***
* 4、參數為數組的方法
* @author 2014-11-7 上午11:01:58
* @param nameArray
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public void setNameArray(String[] nameArray) {
this.nameArray = nameArray;
}
/**
* 5、參數為集合的方法
* @author 2014-11-7 上午11:03:26
* @param list
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public void setList(List<String> list) {
this.list = list;
}
/**
* 6、返回值為數組的方法
* @author 2014-11-7 上午11:04:08
* @return
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-7
* @modify by reason:{原因}
*/
public String[] getNameArray() {
return nameArray;
}
public List<String> getList() {
return list;
}
}
/**
調用對象的方法
- @author 2014-11-8 上午11:17:46
- @param object 要操作的對象
- @param methodName 方法名稱
- @param parameterClasses 參數的Class數組
- @param methodParameters 具體的方法參數值
- @return 方法調用后返回的對象,如果沒有返回值則為null
- @modificationHistory=========================邏輯或功能性重大變更記錄
- @modify by user: {修改人} 2014-11-8
- @modify by reason:{原因} */ private static Object invokeMethod(Object object,String methodName,Object[] methodParameters,Class ... parameterClasses){
Object result = null;
try {
//參數為null的情況底層已經處理了 //獲取某個類的方法時,有多個參數的時候使用new Class[]{}數組的形式 Method method = object.getClass().getMethod(methodName, parameterClasses); //調用某個類的方法時,有多個參數的時候或者參數為集合或數組的時候,參數值必須使用new Object[]{}數組的形式傳遞進去。 result = method.invoke(object, methodParameters);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}finally{
return result;
}
}
@SuppressWarnings("unchecked") public static void main(String[] args) throws SecurityException,
NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
TestReflectMethod testReflectMethod = new TestReflectMethod();
/0、實例化內部類對象*/ User user = testReflectMethod.new User();
/*1、沒有參數的方法/ String name = (String)invokeMethod(user,"getName", null);
System.out.println("1、沒有參數有返回值的方法 name: "+name);
String param = "Tom";
/*2、有一個參數且沒有返回值的方法/ Object noReturn = invokeMethod(user,"setName" , new Object[]{param},String.class);
System.out.println("2、有一個參數但沒有返回值的方法,則調用后返回值為null "+noReturn);
/*3、多個參數的方法/ Object noReturnObject = invokeMethod(user,"print",new Object[]{"Name_2",2},new Class[]{String.class,Integer.class});
System.out.println("3、多個參數的方法 "+noReturnObject);
/*4、參數為數組的方法/ String[] arrString = { "A", "B" }; //這個警告是因為方法中的參數使用的是...的形式。這個如果使用("A","B")的形式就不會出現了. //當參數為數組或者集合的時候必須使用new Object[]{}的方式 invokeMethod(user, "setNameArray",new Object[]{arrString}, String[].class);
System.out.println("4、參數為數組的方法");
/*5、參數為集合的方法/ List<String> list = new ArrayList<String>(); list.add("list1"); list.add("list2"); //先添加進去值 invokeMethod(user,"setList", new Object[]{list},List.class); //獲取值 List<String> returnList = (List<String>)invokeMethod(user,"getList",null);
System.out.println("5、參數為集合的方法"+returnList.toString());
/*6、返回值為數組的方法/ //返回的為Object所以需要強制轉換 String[] returnStringArray = (String[])invokeMethod(user,"getNameArray",null);
System.out.println("6、返回值為數組的方法"+returnStringArray.length);
} }</pre></h2> 來自:http://blog.csdn.net/baidu_18607183/article/details/40920355