[英]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.