Method对象是否等效于Command设计模式中的Command对象



我刚刚发现Java中存在Method类。

在Command设计模式的上下文中,该类的实例是否等效于Command类的实例?

如果没有,这个类的实际用途是什么?

在Command设计模式的上下文中,该类的实例是否等效于Command类的实例?

不,绝对不是:Method类是Java反射特性的一部分。另一方面,命令模式与语言无关,因此它可以用任何语言实现,包括缺乏反射功能的语言。

Method类的实际用途是访问编译时无法访问的类的方法。您可以按名称加载类,获取其方法对象(也可以按名称),并执行调用。

话虽如此,但这并不意味着不能使用反射实现类似命令模式的行为。事实上,您可以通过消除对代码的编译时依赖性来提高实现的灵活性。例如,您可以构建一个使用插件的系统,并要求插件类实现特定的方法。你可以告诉他们,只要他们的类实现了你需要的方法,插件就会被接受,而不是向插件编写者提供一个带有方法签名的接口。在运行时,您将能够通过反射发现正确的方法,并在没有编译时依赖关系的情况下调用用户代码。

这个类以及类Field、类Class都是反射API的一部分。此API用于以间接方式提供对对象的访问。

反射背后的第一个想法是允许物体描述自己。例如,IDE可以显示对象的所有属性,用于调试、RAID开发等等

如果反射仍然以这种方式使用,那么它今天也被用来动态地发现对象或类的结构,并在不明确知道的情况下对其进行"操作":更改其字段的值或调用其方法之一。

例如,如果你知道类A,你可以这样调用A的方法m():

A a = new A();
a.m();

有了反射,在不明确知道A类的情况下,你可以:

Object a = A.getDeclaredConstructors()[0].newInstance();
Method m = a.getClass().getMethod("m");
m.invoke(a, null);

在第二种情况下,您可以想象一种更通用的机制,在这种机制中,您可以发现方法或字段,并在不事先了解它们的情况下调用它们或更改它们的值。

因此,要直接回答您的问题,它与Command设计模式无关。

相关内容

最新更新