Java与PHP的等价物';s call_user_func()

Java与PHP的等价物';s call_user_func(),java,Java,我试图做的是用字符串变量调用方法/对象 我有“foo”和“bar”,需要做foo.bar() 是否有类似PHP的调用用户函数()?还有其他建议吗?在java中,您应该使用反射 正式文件: 您的案例可能如下所示: Class<?> c = Class.forName("foo"); Method method = c.getDeclaredMethod ("bar", new Class [0] ); method.invoke (objectToInvokeOn, new Obje

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

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


是否有类似PHP的
调用用户函数()
?还有其他建议吗?

在java中,您应该使用反射

正式文件:

您的案例可能如下所示:

Class<?> c = Class.forName("foo");
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);

作为旁注:类名应该以
大写字母开始,例如
Foo

理论上没有完全等效的函数,因为Java是纯OOP,因此它不提供全局作用域函数调用程序-顺便说一句,这是复制反射本身的拙劣意图,PHP函数在当时不是合适的对象

如前所述,您可以使用,其行为类似于

TL;DR


您可以用Java反射类[Class,Method,Field]来模拟
call\u user\u func*
东西。

如果您有类实现的接口,那么您可以创建一个具有通用方法处理的代理类。但这比反思更为具体。

你可以像其他人建议的那样思考,但这是一件复杂而缓慢的事情。Hwoever Java不是为这样工作而设计的。如果您能从总体上解释一下您想要实现什么,那么可能会有更好的方法,例如将字符串映射到接口实现,这将更好地利用Java的功能。或者您使用Java执行错误的任务。我有一个jsp文件(gui.jsp),它需要两个参数,如gui.jsp?class=Users&method=getUsers,因此gui.jsp调用Users.getUsers(),并根据用户的选择将结果导出为xml或json。我的观点是类应该被动态调用。我对Java非常陌生。所以,欢迎您提出任何其他类型的结构。您意识到您正在创建一个巨大的安全漏洞吗?如果有人调用
gui.jsp?class=System&method=getProperties
gui.jps?class=System&method=exit
,坦率地说,这听起来很危险。您所尝试的将向web公开类的内部工作,一个小错误可能会导致您允许人们在类中执行任何方法,从而导致潜在的大安全漏洞。首先,我必须使用一个Web框架(例如Struts、Wicket,我不知道是否有更好/更简单的选择,因为我不太会使用Java进行Web开发)它允许您将URL和URL参数映射到控制器对象的方法。感谢您的关注,但只有一组不会滥用该结构的开发人员在本地网络上临时使用它,我也知道我在做什么。我将gui.jsp放在其他类前面,以允许其他类在一个视图中查看结果。一定要这样一段时间。实际的url结构将是
/users/getUsers.jsp
。它(我指的是gui.jsp)对我们来说是一种测试页面,这意味着不必担心这种安全规则,但再次感谢您的建议。
     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);