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
- Java反射调用多种类型的方法总结
- 通过java反射机制动态调用某方法的总结
- Java反射机制总结学习--调用类的方法
- java反射(3)--反射的调用方法
- Java:调用反射的方法
- Java反射学习总结二(用反射调用对象的私有属性和方法)
- java反射调用方法
- Java反射调用方法
- Java 反射 方法调用
- java 反射 方法调用
- java反射调用方法
- JAVA 反射调用方法
- java 反射调用方法
- Java反射调用方法
- Java反射调用未知的方法
- java 反射机制的几个调用方法
- 反射的调用方法
- JAVA 反射之方法调用
- 2014-11-8Android学习------Android 实现图片的旋转--------动画Animation学习篇
- 在cubieboard2双卡版上从零构建Android4.2.2系统
- iperf 用法
- 优化输入输出后的计数排序
- Android版的Smack:aSmack
- Java反射调用多种类型的方法总结
- Linux procfs详解
- Bugfree邮件发送设置(以QQ邮箱为例)
- poj The Luckiest number
- 分享java程序设计中一个小程序:获取当前系统日期和时间在小程序中显示出来
- thinkphp模板中可用常量
- c++ namespace
- servlet sendRedirect Invalid character constant
- ASIHTTPRequest