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

Java 从类中获取方法,然后通过对象调用,java,reflection,Java,Reflection,为了通过反射在对象上调用方法,我知道的唯一方法如下: Object o = ...; Method m = o.getClass().getMethod("methodName",null); Object x = m.invoke(o,null); 为什么Java在对象类中没有getMethods方法?(以及getSuperClass、getFields等) 所以我们可以这样做: Object x = o.invoke("methodName",null); 为什么不呢?我认为这是出于性能

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

Object o = ...;
Method m = o.getClass().getMethod("methodName",null);
Object x = m.invoke(o,null);
为什么Java在对象类中没有getMethods方法?(以及getSuperClass、getFields等)

所以我们可以这样做:

Object x = o.invoke("methodName",null);
为什么不呢?我认为这是出于性能原因


(也作为旁注。在英语中,说“subject调用object”更有意义,因此在编程术语中是object invoke method。但是在Java中,我们得到了“object上的method invoke”。很高兴今天我能把你弄糊涂了。)

对象

是类层次结构的根

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


任何附加行为都由子类描述,但子类不一定要有行为。您可以声明一类常量、一个
枚举
,甚至一个数组。那么,在这些对象上使用
invoke
方法是没有意义的。

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

将反射实用程序方法添加到
对象
会破坏这一点。您可以选择调用
o.myMethod()
o.invoke(“myMethod”,null)
,这将引入一种不安全的Java编程风格,因为在编译时不能保证后者中存在“myMethod”。这将使开发人员很容易摆脱类型安全,只使用<代码>。调用< < /代码>,不必费心考虑适当的面向对象设计。


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

一件有趣的事情:如果存在
object#getMethods
,然后它还必须返回一个与其自身相对应的
方法
对象(可能是
集合
方法[]
)。@dennisMeng
方法.class.getMethods()
反射并不是使用对象的主要方式。我们为什么需要它?如果我们在创建代码时知道方法名称,我们可以简单地使用
o.methodsName(参数)
。通过这种方式,编译器可以完成他的工作,并保护我们免受许多错误的影响。如果我们在创建代码时不知道方法名称,并且希望调用用户将传递的名称的方法,我们可以使用
o.getClass().getMethod(“methodName”,null)。调用(对象,参数)
。唯一的改进是代码的长度。@Pshemo,我同意。但我认为在某些(许多)情况下,动态编程可以减少您必须编写的代码量。