首先放出测试类
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(); } }本文测试代码下载
转载请注明:热爱改变生活.cn » 反射方法调用以及自动根据方法参数类型和个数进行方法调用——反射_4
本博客只要没有注明“转”,那么均为原创。 转载请注明链接:sumile.cn » 反射方法调用以及自动根据方法参数类型和个数进行方法调用——反射_4