Java反射调用多种类型的方法总结

来源:互联网 发布:网站在线帮助文档源码 编辑:程序博客网 时间:2024/06/05 17:50

最近一直在搞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);}}


0 0
原创粉丝点击