在没有已知构造函数的情况下调用动态方法?

时间:2011-05-28 11:04:08

标签: java reflection dynamic

如果我在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已经是一个我称之为函数的方法类型,我为什么需要呢?

由于

3 个答案:

答案 0 :(得分:1)

假设它是一个实例方法,你必须有一个实例来调用该方法,就像其他任何东西一样。如何掌握该实例将取决于您正在尝试做什么;你可以传入一个Constructor,或者一个现有对象的引用,或者当你要求它时创建实例的一些接口......我们真的无法给出任何关于哪种方法最有用的建议在不知道你想要做什么的情况下适合。

如果它是静态方法,您可以为第一个参数传递null

答案 1 :(得分:1)

您正在寻找或考虑的是“lambda函数”的概念。这些可以孤立地调用。

方法类型不是独立的方法,而更像是对象的“路径”。将其与/subscribe.html之类的相对网址进行比较。脱离上下文这是没有用的,但当与www.example.com这样的网站捆绑在一起时,这是有道理的。

因此,Method只能与实例结合使用。 (编辑:正如John所说,除非它是一个不需要实例的静态方法)

答案 2 :(得分:0)

如果你可以在不提供实例的情况下安全地调用方法,那么它应该是一个静态方法,在这种情况下,忽略任何提供的实例,你可以给它null

如果必须提供对象的实例,则无法解决此问题。

如果编写该方法的开发人员将其标记为非静态错误,我建议您与他们讨论他们为什么这样做。