2

私がやろうとしているのは、文字列変数を使用してメソッド/オブジェクトを呼び出すことです。

私は' foo'と' bar'を持っていて、する必要がありますfoo.bar()

PHPのようなものはありcall_user_func()ますか?他に何か提案はありますか?

4

4 に答える 4

1

Javaでは、リフレクションを使用する必要があります。

公式ドキュメント:http ://docs.oracle.com/javase/tutorial/reflect/index.html

あなたのケースは次のようになります。

Class<?> c = Class.forName("foo");
Method  method = c.getDeclaredMethod ("bar", new Class [0] );
method.invoke (objectToInvokeOn, new Object[0]);

ここobjectToInvokeOnで、呼び出したい(クラスfooの)インスタンス/オブジェクトはどこにありますか。あなたがそれを持っている場合。

それ以外の場合は、次のことを行う必要があります。

Class<?> c = Class.forName("foo");
Object objectToInvokeOn = c.newInstance();
Method  method = c.getDeclaredMethod ("bar", new Class [0] );
method.invoke (objectToInvokeOn, new Object[0]);
于 2012-11-13T14:18:31.833 に答える
1

これはJavaではリフレクションと呼ばれます。詳細については、このチュートリアルを参照してください。

     foo fooObject = new foo(); //not using reflection, but you can if you need to

     //use reflection on your class()not object to get the method
     Method method = foo.class.getMethod("bar", null);

     //Invoke the method on your object(not class)
     Object bar = method.invoke(fooObject, null);

UpperCase補足として:クラス名はegで始まる必要がありFooます。

于 2012-11-13T14:20:18.570 に答える
0

Javaは純粋OOPであり、グローバルスコープ関数の呼び出し元を提供しないため、理論的には完全に同等の関数はありません。ちなみに、これはリフレクション自体を複製するというくだらない意図であり、当時は適切なオブジェクトではないPHP関数です。 。

すでに述べたように、 PHPのように動作するJavaのリフレクションを使用できます。

TL; DR

call_user_func*Javaリフレクションクラス[クラス、メソッド、フィールド]を使用してエミュレートできます。

于 2012-11-13T14:36:03.927 に答える
0

クラスが実装するインターフェイスがある場合は、ジェネリックメソッド処理を使用してプロキシクラスを作成できます。しかし、それは反省よりもさらに具体的です。

于 2012-11-13T14:44:59.147 に答える