在Java中以动态方式调用方法

时间:2017-12-27 05:01:32

标签: java java-8

我是Java的新手。我想创建一个方法,将第一个参数作为Function,将第二个参数作为对象列表,如下所示:

  public void dynamicMethodExecution(Somefunction someFunction, List<T> params) {
    //Pass the params to the someFunction and execute the someFunction.
  }

如果我将任何函数和任何参数列表传递给&#39; dynamicMethodExecution&#39;,那么它应该通过传递参数来执行该函数。

此方法&#39; dynamicMethodExecution&#39;应该尽可能通用,即它应该采取任何类型的功能并在运行中执行它。

任何想法,我该怎么做?

2 个答案:

答案 0 :(得分:0)

如果您坚持使用内置的Function<T, F>类,那么此类上的apply方法就是这样做的。但是,正如我在评论中所说,Function类只代表1-ary函数,因此无法直接表示采用零参数或带有多个参数的函数。

答案 1 :(得分:0)

我终于做到了。请分享你的观点。

  public static void asyncMethodInvoke(Class<?> clazz, String methodName, Object[] args) {
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          Class<?> params[] = new Class[args.length];
          for (int i = 0; i < params.length; i++) {
            if (args[i] instanceof Byte) {
              params[i] = Byte.TYPE;
            }
            else if(args[i] instanceof Short) {
              params[i] = Short.TYPE;
            }
            else if(args[i] instanceof Character) {
              params[i] = Character.TYPE;
            }
            else if(args[i] instanceof Integer) {
              params[i] = Integer.TYPE;
            }
            else if(args[i] instanceof Float) {
              params[i] = Float.TYPE;
            }
            else if(args[i] instanceof Double) {
              params[i] = Double.TYPE;
            }
            else if(args[i] instanceof Long) {
              params[i] = Long.TYPE;
            }
            else if(args[i] instanceof Boolean) {
              params[i] = Boolean.TYPE;
            }
            else {
              params[i] = args[i].getClass();
            }
          }

          Object _instance = clazz.newInstance();
          Method method = clazz.getDeclaredMethod(methodName, params);
          method.invoke(_instance, args);
        }
        catch (Exception e) {
          System.out.println(e.getCause().getMessage());
        }
      }
    }).start();
  }

我正在使用Thread来异步运行方法。