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);