私がやろうとしているのは、文字列変数を使用してメソッド/オブジェクトを呼び出すことです。
私は' foo
'と' bar
'を持っていて、する必要がありますfoo.bar()
PHPのようなものはありcall_user_func()
ますか?他に何か提案はありますか?
私がやろうとしているのは、文字列変数を使用してメソッド/オブジェクトを呼び出すことです。
私は' foo
'と' bar
'を持っていて、する必要がありますfoo.bar()
PHPのようなものはありcall_user_func()
ますか?他に何か提案はありますか?
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]);
これは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
ます。
Javaは純粋OOPであり、グローバルスコープ関数の呼び出し元を提供しないため、理論的には完全に同等の関数はありません。ちなみに、これはリフレクション自体を複製するというくだらない意図であり、当時は適切なオブジェクトではないPHP関数です。 。
すでに述べたように、 PHPのように動作するJavaのリフレクションを使用できます。
TL; DR
call_user_func*
Javaリフレクションクラス[クラス、メソッド、フィールド]を使用してエミュレートできます。
クラスが実装するインターフェイスがある場合は、ジェネリックメソッド処理を使用してプロキシクラスを作成できます。しかし、それは反省よりもさらに具体的です。