Java相当于PHP的call_user_func()

时间:2012-11-13 14:16:39

标签: java

我要做的是用字符串变量调用方法/对象。

我有'foo'和'bar',需要做foo.bar()

是否有类似PHP的call_user_func()?还有其他建议吗?

4 个答案:

答案 0 :(得分: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]);

答案 1 :(得分:1)

在Java中称为反射:有关详细信息,请参阅this tutorial

     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开头,例如Foo

答案 2 :(得分:0)

理论上没有完全等效的函数,因为Java是纯OOP,因此它不提供全局范围函数调用者 - 顺便说一句,这是一个复制反射本身的蹩脚意图,因为PHP函数不是正确的对象当时。

如前所述,您可以使用Java's reflection,其行为类似于PHP's

<强> TL; DR

您可以使用Java反射类[Class,Method,Field]模拟call_user_func*内容。

答案 3 :(得分:0)

如果您具有该类实现的接口,则可以使用泛型方法处理创建代理类。但这比反思更具体。