繁体   English   中英

从类获取方法,然后通过对象调用

[英]Get method from Class then invoke via Object

为了通过反射在对象上调用方法,我知道怎么做的唯一方法是这样的:

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时,我们得到了“对象上方法调用”。很高兴让我感到困惑你今天。)

我认为原因是应该将java.lang.Object用作类层次结构的根,并且其上的任何方法都应属于该对象的实例 ,而不是对象的概念。

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

通过强迫开发人员明确要求Class的实例,我们在反射API和“具体” Java之间保持了这种分离。 因此,尽管有时可能会很痛苦,但最好鼓励开发人员正确编写代码。 同样,这意味着对象的OOP概念由java.lang.Object表示,而类的概念由java.lang.Class表示,这是对职责的一种很好的清晰区分。

Object

是类层次结构的根。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM