我要做的是用字符串变量调用方法/对象。
我有'foo
'和'bar
',需要做foo.bar()
是否有类似PHP的call_user_func()
?还有其他建议吗?
答案 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)
如果您具有该类实现的接口,则可以使用泛型方法处理创建代理类。但这比反思更具体。