0

Javaでこのようなことができるかどうか知りたいです。何人かのメンバーがいるクラスがあるとしましょう。

Class Test {
  // some constructors and members
  public Object func;
} 

次に、他のいくつかのクラスから定義されたいくつかの関数があります。実行時にこれらの関数をTestクラスに割り当てて、状況に応じてeval(test.func)が任意の関数になるようにします。どのようにそれをしますか?ただし、関数を文字列として渡すことは、JavaScriptで簡単に実行できます。

リフレクションまたはクロージャーは、私が達成したいことに関連していますか?ありがとうございました

4

3 に答える 3

2

call -a-method-named-string-at-runtime-in-java-and-cから

Javaでは、リフレクションapiを介して実行できます。

Class.getMethod(String methodName、Class ... parameterTypes)を見てください。

(引数を持つ非静的メソッドの)完全な例は次のようになります。

import java.lang.reflect.*;

public class Test {

    public String methodName(int i) {
        return "Hello World: " + i;
    }

    public static void main(String... args) throws Exception {
        Test t = new Test();
        Method m = Test.class.getMethod("methodName", int.class);
        String returnVal = (String) m.invoke(t, 5);
        System.out.println(returnVal);
    }
}

どの出力:

Hello World:5

于 2013-02-12T05:37:47.133 に答える
1

reflection名前でメソッドを呼び出すために使用できます。例:

Method myMethod = getClass().getMethod("methodName",MyClass.class);
myMethod.invoke(classObj);

eval動的コードを実行するようなものが必要な場合は、 JRubyまたはGroovyを検討してください

于 2013-02-12T05:40:07.810 に答える
1

答えはイエスです、あなたはこれを行うことができますが、あなたはすべきですか?このパターンは、第一級関数を使用する言語に最適ですが、Javaは名詞の王国であり、さまざまなパターンが適用されます。

どうしてもJavaで関数型プログラミングをしなければならないときは、GoogleのGuavaライブラリを使用して支援します。リフレクションを使用して純粋なJavaに固執することもできますが、Guavaが提供する抽象化が好きです。Guavaは、基本的に関数への参照であるFunctionオブジェクトを定義します(ジェネリック入力タイプと出力タイプを使用)。

class Test {
  // some constructors and members
  public Function func;

  @Test
  public void testFunc() {
    assertEquals("abc", func.apply("123"));
  }
}
于 2013-02-12T05:41:01.393 に答える