最近一直在搞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); } }
时间: 2024-10-10 21:24:10