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

Java 在没有已知构造函数的情况下调用动态方法?,java,reflection,dynamic,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对象作为参数传递

如果我在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已经是一种方法类型,我只是像函数一样调用它,为什么我需要它呢


谢谢

假设它是一个实例方法,您必须有一个实例来调用该方法,就像其他方法一样。你如何抓住那个实例将取决于你试图做什么;您可以传入一个
构造函数
,或对现有对象的引用,或在请求实例时创建实例的某个接口。。。我们无法在不知道您想做什么的情况下,就哪种方法最合适向您提供任何建议


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

您正在寻找或思考的似乎是“lambda函数”的概念。这些可以单独调用

方法类型不是独立的方法,更像是对象的“路径”。将其与相对URL(如
/subscribe.html
)进行比较。断章取义,这是非常无用的,但当与
www.example.com
这样的网站捆绑在一起时,它是有意义的


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

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

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


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

Hmmm。。。您似乎忽略了Java方法在对象上被调用这一基本点。。。您已经从对象中提取了方法,并传递了它而不是对象?为什么?只需传递实例,并对其调用方法。。。这是一种非常普遍的模式。我看不出所有这些反射性巫毒的动机。如果我直接传入,它将创建一个全新的对象,可能不需要与原始对象具有相同的信息。这是我关心的,嗯?你传递一个对象,接收者使用该对象“回叫你”。。。所以这个物体一定是一个新的物体。我怀疑您误解了面向对象编程的一个(或多个)基本原理。。。我怀疑你真正想要的是一个依赖注入框架。了解你的动机会有帮助。为什么你首先想要一个反思性的解决方案?我喜欢网站和页面的类比。