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)これにより、「myMethod」が後者に存在するというコンパイル時の保証がないという点で、コンパイルセーフではないプログラミング スタイルが Java に導入されます。.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 に答える