从Class获取方法然后通过Object调用

时间:2013-10-09 21:49:00

标签: java reflection

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

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我们得到'方法调用对象'。很高兴我今天可能会迷惑你。)

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

班级Object

  

是类层次结构的根。

它描述了每个课程所需的行为。

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