关于java反射中 Class.getMethod 中遇到的问题

使用这个的原因:在项目中,有遇到需要通过一个指定method 的name字符串来调用指定的方法

  1. 对应的方法的参数是一个数组,类似于main(String args[]) 的方法 怎么传递args[]:

    这样写(假设方法的参数是String[],如main(String[] args)):

    Class yourClass = Class.forName(“YourClass”);//假设你要动态加载的类为YourClass

    Class[] parameterTypes = new Class[1];//这里你要调用的方法只有一个参数

    parameterTypes[0] = String[].class;//这个参数的类型是String型的/////应该是String[]

    Method method = yourClass.getMethod(“main”, parameterTypes);//这里假设你的类为YourClass,而要调用的方法是main

    Object[] args = new Object[1];//假设你要传入两个参数////应该是一个

    String[] argments = new String[2];//假设你要传入两个参数

    argments[0] = “OK”;

    argments[1] = “NO”;

    args[0] = argments;

    method.invoke(yourClass.newInstance(), args);//调用方法

  2. 关于getMethod 的两个参数 这两个参数,一个是String 表示method 的name ,另一个是一个Class数组,表示需要反射的方法的参数,遇到的问题中,被反射的方法中定义的类型是什么,那么这个Class 数组也必须是对应的Class 类型 ,比如,我需要反射的方法参数是一个Map 类型,那么我在传递这个class 数组时就必须是Map.Class 而不能是 Map map = new HashMap(); map.getClass() 

    事例方法的实现

    Service service = new ServiceImpl();

    Map map = new HashMap();

    map.put(“123”, “123”);

    map.put(“zrc”, “zrc”);

    // 获取全部方法,不传入对应的接口参数

    Method[] methods =service.getClass().getDeclaredMethods();

    for (Method method : methods) {

    System.out.println(method.getName());

    if(“test4”.equals(method.getName())){

    String s = (String) method.invoke(service, map);

    System.out.println(s);

    }

    }

    System.out.println(“\n——————————————————————————————————— \n”);

    Method method2 = service.getClass().getDeclaredMethod(“test4”, new Class[]{Map.class});

    method2.invoke(service, map);

    System.out.println(“\n——————————————————————————————————— \n”);

    Method method3 = service.getClass().getMethod(“test4”, new Class[]{Map.class});

    method3.invoke(service, map);

 

 

 

2014年与银海商超开发中用到的反射事例, string Methodname 

private void util(String name, Integer level) throws Exception {
JSONObject param = JSONObject.parseObject(network.receive(level, request, response));
Method method = memberService.getClass().getMethod(name, new Class[] { Map.class });
String result = (String) method.invoke(memberService, param);
param.clear();
param.put("result", result);
network.write(param, level, response);
}

private void utilForMap(String name, Integer level) throws Exception {
JSONObject param = JSONObject.parseObject(network.receive(level, request, response));
Method method = memberService.getClass().getMethod(name, new Class[] { Map.class });
Map result = (Map) method.invoke(memberService, param);
network.write(result, level, response);
}