反射方法调用以及自动根据方法参数类型和个数进行方法调用——反射_4

首先放出测试类

class Math_Test {
	public void add(int a, int b) {
		System.out.println(a + b);
	}

	public int add(int a, int b, int c) {
		return a + b + c;
	}

	public void add(String a, String b) {
		int a_ = Integer.parseInt(a);
		int b_ = Integer.parseInt(b);
		System.out.println(a_ + b_);
	}
}

在主类中进行测试

public static void main(String[] args) {
	Math_Test m = new Math_Test();
	// 首先获得m的类类型
	Class c = m.getClass();
	// use_add_int_int(m, c);
	// use_add_int_int_int(m, c);
	// use_add_string_string(m, c);
	// 获得自定以的方法
	Method[] method = c.getDeclaredMethods();
	for (Method method2 : method) {
		System.out.print("当前调用的方法:" + method2.getName() + "(");
		// 获取参数类型
		Class[] type = method2.getParameterTypes();
		String parType = "";
		for (Class class1 : type) {
			System.out.print(class1.getSimpleName() + ",");
			// 记录参数类型个数以及分别是什么类型的
			if ((class1.getName()).contains("String")) {
				parType += "s";
			}
			if ((class1.getName()).contains("int")) {
				parType += "i";
			}
		}
		System.out.print(")");
		System.out.println();
		// 根据记录的参数类型以及个数invoke不同的方法
		if (parType.equals("ss")) {
			try {
				Method method3 = c.getMethod(method2.getName(), String.class, String.class);
				System.out.print("传入参数:" + "'2'+'3'" + "结果为:");
				method3.invoke(m, "2", "3");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else if (parType.equals("ii")) {
			try {
				Method method3 = c.getMethod(method2.getName(), int.class, int.class);
				System.out.print("传入参数:" + "1+2" + "结果为:");
				method3.invoke(m, 1, 2);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else if (parType.equals("iii")) {
			try {
				Method method3 = c.getMethod(method2.getName(), int.class, int.class, int.class);
				System.out.print("传入参数:" + "1+2+3" + "结果为:");
				Object o = method3.invoke(m, 1, 2, 3);
				System.out.println((int) o);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
以上代码运行结果:
当前调用的方法:add(String,String,)
传入参数:'2'+'3'结果为:5
当前调用的方法:add(int,int,int,)
传入参数:1+2+3结果为:6
当前调用的方法:add(int,int,)
传入参数:1+2结果为:3

三个被注释掉的普通方式下的方法调用

private static void use_add_string_string(Math_Test m, Class c) {
	try {
		Method me = c.getMethod("add", String.class, String.class);
		me.invoke(m, "1", "2");
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
private static void use_add_int_int_int(Math_Test m, Class c) {
	// 获得方法名为"add",参数列表为(int,int)类型的方法
	try {
		Method me;
		me = c.getMethod("add", int.class, int.class, int.class);
		Object o = me.invoke(m, 2, 3, 1);
		System.out.println("通过返回值获得的结果:" + (int) o);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
private static void use_add_int_int(Math_Test m, Class c) {
	try {
		// 获得方法名为"add",参数列表为(int,int)类型的方法
		Method me = c.getMethod("add", int.class, int.class);
		me.invoke(m, 2, 3);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
[dl href='http://pan.baidu.com/s/1pJNyTHx']本文测试代码下载[/dl]
反射获得类的成员变量以及构造方法——反射_3 2015-07-01
AndroidStudio配置记录 2015-07-04

评论区