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

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

Java反射调用多种类型的方法总结的相关文章

Java 反射调用私有域和方法(setAccessible)

Java 反射调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了AccessibleObject类,该基类有两个setAccessible方法能在运行时压制Java语言访问控制检查(Java language access control checks),从而能任意调用被私有化保护的方法.域和构造方法 public class AccessibleObjectextends

java反射调用某个对象的方法

// 反射调用某个对象的方法 public Object invokeMethod(Object methodObject, String methodName, Object[] args) throws Exception { Class ownerClass = methodObject.getClass(); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) {

java反射调用方法

1:Class类中的方法 public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException 参数: name - 方法名 parameterTypes - 参数数组 返回: 该类与指定名和参数相匹配的方法的 Method 对象 2:Method类中的方法; public Object invoke(Object obj,

Java反射理解(五)-- 方法反射的基本操作

Java反射理解(五)-- 方法反射的基本操作 方法的反射 1. 如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法 2. 方法反射的操作 method.invoke(对象,参数列表) 举例 具体操作请看下面举例: import java.lang.reflect.Method; class A{ public void print(){ System.out.println("helloworld"); } public void print(int a,int b){

C#反射调用程序集类中方法

建立类 class OperatorClass { /// <summary> /// 加法 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> /// public static int Add(int x, int y) { r

通过反射 调用 类里面的 方法的方法

通过反射 调用 类里面的 方法的方法(注意 重载 ,可以 按F12转到 定义 查看 ): 错误方法: MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType); dynMethod.Invoke(this, new object[] { methodParams }); 正确 方法 : MethodInfo dynMethod = this.GetType().GetMethod("Draw_&qu

java黑魔法-反射机制-02-通过Java反射调用其他类方法

package com.aaron.reflect; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; /** * Created by IntelliJ IDEA. * File: TestRef.java * User: leizhimin * Date: 2008-1-28 14:48:44 */ public class TestRef { //直接 foo.outIn

通过反射调用类中的方法

操作步骤: 1:实例化Class: 2:通过Class类的getMethod()方法取得一个Method的对象,并设置次方法操作时所需的参数类型: 3:使用invoke进行调用,并向方法中传递要设置的参数,但在使用invoke()方法时必须传入一个类的实例化对象 实例1:sayChina()方法中没有参数 package cn.itcast02; import java.lang.reflect.Method; //调用Person类中的sayChina()方法,没有参数 public clas

C#如何通过反射调用类下的方法

首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 /// </summary> /// <returns></returns> public string SayHello() { string str = "你好!"; return str; } /// <summary> /// 有参方