2017-12-27 3 views
0

私はJavaの初心者です。それは、その後、私は「dynamicMethodExecution」に任意の関数とパラメータの任意のリストを渡した場合Javaでメソッドを動的に呼び出す

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

:私は次のように機能し、オブジェクトのリストとして2番目のパラメータとして最初のパラメータを取る方法を、作成したいですパラメータを渡して関数を実行する必要があります。

このメソッド 'dynamicMethodExecution'は可能な限り一般的なものである必要があります。すなわち、あらゆる種類の機能を実行し、その場で実行する必要があります。

どうすればいいですか?

+0

*「あらゆる種類の機能」*とはどういう意味ですか? ['java.util.function.Function'](https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html)?クラスメソッド?インスタンスメソッド(ある場合)インスタンス? –

+0

'Function ... 1つの引数を受け取り、結果を生成する関数を表します。 'あなたが今使っているクラスは、ただ一つの議論を受け入れるつもりです。あまり一般的ではありませんが、これはあなたの目標です。 –

+0

'java.util.function.Function'オブジェクトについて言えば、あなたの質問は@ SilvioMayoloによって答えられました。方法について話している場合は、https://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-の複製として質問を終了します。メソッド名-a-a-string –

答えて

0

組み込みのFunction<T, F>クラスを使用している場合は、このクラスのapplyメソッドが正しく動作します。しかし、私のコメントで述べたように、Functionクラスは1-ary関数しか表現しないので、ゼロ引数を取る関数または複数引数を取る関数を直接表現することはできません。

+0

私は卑劣なOPが機能と方法を区別していないという疑惑。彼らは彼らのメソッドに 'dynamicMethodExecution'という名前をつけました... –

+0

申し訳ありません、それについては分かりません。だから私は、関数とパラメータをリストし、それを実行するメソッドが必要です。 – Juvenik

+0

@Juvenik関数の意味を最初に定義します。 –

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(); 
    } 

スレッドを使用してメソッドを非同期に実行しています。

関連する問題