web-dev-qa-db-ja.com

クラスAPIのgetDeclaredConstructorsとgetConstructorsの違いは何ですか?

JavaリフレクションAPIには、コンストラクターを呼び出すための2つの異なるメソッドがあります:getDeclaredConstructors/getConstructorsメソッドです。Java docsは少し異なります(getDeclaredConstructorsはパブリックコンストラクタではなくすべてのコンストラクタを返すことを意味するようです)。APIがこれら2つの異なるメソッドを明示的にサポートする理由は明らかではありません。

さらに重要なことに、私は疑問に思っています:クラスを動的に呼び出す場合、あるメソッドが別のメソッドよりも望ましい場合はいつですか?たとえば、プライベートコンストラクターにアクセスする目的は何ですか?

59
jayunit100

getDeclaredConstructors (必要な場合allコンストラクタ)

このClassオブジェクトが表すクラスによって宣言されたすべてのコンストラクタを反映するConstructorオブジェクトの配列を返します。これらは、パブリック、保護、デフォルト(パッケージ)アクセス、およびプライベートコンストラクターです。

getConstructors (必要な場合_publicコンストラクタのみ)

このClassオブジェクトが表すクラスのすべてのパブリックコンストラクターを反映するConstructorオブジェクトを含む配列を返します。

したがって、両方のドキュメントを見ると、getConstructorspublicコンストラクタのみを返し、getDeclaredConstructorsはすべてのコンストラクタ(publicprotected、デフォルト(パッケージ)アクセス、およびprivate

したがって、publicコンストラクタのみが必要な場合はgetConstructorsを使用するのは簡単です。それ以外の場合、すべてのコンストラクタが必要な場合は(コンストラクタのアクセス修飾子に関係なく)、getDeclaredConstructorsを使用します。

58
Bhesh Gurung

getDeclaredXX()メソッドは、クラスの作成者が必ずしも意図していない方法でクラスを操作するために存在します。プライベートメソッドを呼び出すことができるgetDeclaredMethod()メソッドと、プライベートフィールドを取得/設定できるgetDeclaredField()メソッドがあることに注意してください。

「正当な」ユースケースについては完全にはわかりませんが、これらは特定のことを行う場合に明らかに役立ちます。また、このメソッドファミリーは、クラスで具体的に宣言されたものだけを返し、スーパークラスのためにクラスに存在するものは返しません。

同じ理由で、プライベートコンストラクターへのアクセスも役立つと思います。

4
jli

「getDeclaredConstructors」メソッドは、クラス内で宣言されたコンストラクタのみを返します。 「getConstructors」メソッドは、クラス内で宣言されていないがスーパークラスから継承されたコンストラクターも返します。

したがって、何をするかによって異なります。適切なアプローチはありません。スーパーコンストラクターも必要かどうかは、本当に重要です。

2

私はgetDeclaredConstructorsを使用して、コンストラクターがプライベートであるクラスのファクトリーを作成し、システムの「ユーザー」がファクトリーを使用せずにこれらのクラスを直接作成できないようにします。この方法は非常に便利です。

0
Rafa