在没有已知构造函数的情况下调用动态方法?
如果我在Java中这样做,可以动态调用某个类的方法名称。在没有已知构造函数的情况下调用动态方法?
MainApp app = new MainApp();
Method meth = app.getClass().getMethod("myMethod", MyParameterType.class);
//call method
meth.invoke(app, new MyParameterType("hello"));
但是,这工作,因为我知道invoke方法中的构造函数。但是,如果我将Method对象作为参数传递给其他类,并且我不知道谁是构造函数,那么我不能再调用该方法。即使我知道,我可能不想创建一个不同的对象来调用该方法。例如:
//This is in the class call MainApp.java.
//There is a method in MainApp.java that looks this way: myMethod(MyParameterType param);
MainApp app = new MainApp();
OtherClass myClass = new OtherClass();
Method meth = app.getClass().getMethod("myMethod", MyParameterType.class);
myClass.callMe(meth);
//Inside OtherClass.java
public void callMe(Method meth) {
//call method
meth.invoke(########, new MyParameterType("hello"));
}
在这种情况下,我应该为########参数放置什么?在OtherClass.java的上下文中,基础构造函数对象不会被知道。为什么我需要,因为meth已经是一个我刚刚称为函数的Method类型?
感谢
假设它是一个实例方法,你得有一个例如上调用该方法,就像其他任何东西。你如何得到这个实例取决于你想要做什么;你可以传入一个Constructor
,或者引用一个现有的对象,或者某个接口,当你要求它时会创建这个实例......如果不知道是什么,我们无法给你任何关于哪种方法最合适的建议你正在努力。
如果这是一个静态方法,您可以通过null
第一个参数。
看起来你在寻找或想的是'lambda函数'的概念。这些可以孤立地调用。
方法类型不是一个独立的方法,但更像是一个对象的“路径”。将其与相对URL比较,如/subscribe.html
。从上下文来看,这是非常没用的,但是当与像www.example.com
这样的站点捆绑在一起时,这是有道理的。
因此,方法只能与一个实例组合使用。 (编辑:约翰提到的,除非它是这不需要实例当然是一个静态方法)
我喜欢类似的网站和页面。 – corlettk 2011-05-28 11:12:58
如果你可以安全地调用一个方法,而不提供一个实例,它应该是一个静态方法,在这种情况下,任何实例提供的被忽略,你可以给它null
。
如果您必须提供该对象的实例,则无法解决此问题。
如果编写该方法的开发人员将其非正确地标记为非静态,我建议您与他们讨论他们为什么这样做。
嗯......你似乎错过了Java方法在对象上被调用的基本点......你已经从对象中提取了方法,并且通过了它而不是对象?为什么?只要传递实例,并调用它的方法......这是一个非常普遍的模式。我没有看到所有这些反思巫术的动机。 – corlettk 2011-05-28 11:10:08
如果我直接通过它,它将创建一个品牌NEW对象,它可能不需要具有与原始对象相同的信息。这是我的担心。 – Carven 2011-05-28 12:17:02
咦?你传递一个对象,并且接收者使用该对象“回叫你”,所以对象必须以某种方式成为一个NEW对象。我怀疑你误解了一个(或更多)面向对象编程的基础......我怀疑你真正想要的是一个依赖注入框架。这将有助于了解你的动机是什么。*为什么*你首先需要一个反思性解决方案? – corlettk 2011-05-29 00:14:53