2

为了通过反射调用对象上的方法,我知道如何做到这一点的唯一方法是:

Object o = ...;
Method m = o.getClass().getMethod("methodName",null);
Object x = m.invoke(o,null);

为什么 Java 在 Object 类中没有 getMethods 方法?(以及 getSuperClass、getFields 等)。

所以我们可以这样做:

Object x = o.invoke("methodName",null);

为什么不?我认为这是出于性能原因。

(也作为旁注。在英语中,说“主体调用对象”更有意义,所以在编程术语中,对象调用方法。但是使用 Java,我们得到“对象调用方法”。很高兴我能混淆你今天。)

4

2 回答 2

1

我相信原因是它java.lang.Object应该作为类层次结构的根,并且它上面的任何方法都应该与该对象的实例有关,而不是与对象的概念有关。

添加反射实用程序方法Object会破坏这一点。您可以选择调用o.myMethod()or o.invoke("myMethod", null),这将在 Java 中引入一种非编译安全的编程风格,因为没有编译时保证“myMethod”存在于后者中。这将使开发人员很容易摆脱类型安全并一直使用.invoke而无需考虑适当的面向对象设计。

通过强制开发人员显式请求 的实例Class,我们保持了反射 API 和“具体”Java 之间的这种分离。因此,虽然有时会很痛苦,但鼓励开发人员正确编码是件好事。此外,这意味着对象的 OOP 概念由 表示,java.lang.Object类的概念由 表示java.lang.Class,这是一种很好的、​​清晰的职责区分。

于 2013-10-09T22:06:14.017 回答
0

班上Object

是类层次结构的根。

它描述了每个类都需要的行为。

任何其他行为都由子类描述,但子类不一定必须具有行为。您可以声明一个常量类、一个enum,甚至是一个数组。那么invoke对那些有一个方法是没有意义的。

于 2013-10-09T21:54:41.757 回答