JavaリフレクションAPIには、コンストラクターを呼び出すための2つの異なるメソッドがあります:getDeclaredConstructors
/getConstructors
メソッドです。Java docsは少し異なります(getDeclaredConstructors
はパブリックコンストラクタではなくすべてのコンストラクタを返すことを意味するようです)。APIがこれら2つの異なるメソッドを明示的にサポートする理由は明らかではありません。
さらに重要なことに、私は疑問に思っています:クラスを動的に呼び出す場合、あるメソッドが別のメソッドよりも望ましい場合はいつですか?たとえば、プライベートコンストラクターにアクセスする目的は何ですか?
getDeclaredConstructors
(必要な場合allコンストラクタ)
このClassオブジェクトが表すクラスによって宣言されたすべてのコンストラクタを反映するConstructorオブジェクトの配列を返します。これらは、パブリック、保護、デフォルト(パッケージ)アクセス、およびプライベートコンストラクターです。
getConstructors
(必要な場合_public
コンストラクタのみ)
このClassオブジェクトが表すクラスのすべてのパブリックコンストラクターを反映するConstructorオブジェクトを含む配列を返します。
したがって、両方のドキュメントを見ると、getConstructors
はpublic
コンストラクタのみを返し、getDeclaredConstructors
はすべてのコンストラクタ(public
、protected
、デフォルト(パッケージ)アクセス、およびprivate
)
したがって、public
コンストラクタのみが必要な場合はgetConstructors
を使用するのは簡単です。それ以外の場合、すべてのコンストラクタが必要な場合は(コンストラクタのアクセス修飾子に関係なく)、getDeclaredConstructors
を使用します。
getDeclaredXX()
メソッドは、クラスの作成者が必ずしも意図していない方法でクラスを操作するために存在します。プライベートメソッドを呼び出すことができるgetDeclaredMethod()
メソッドと、プライベートフィールドを取得/設定できるgetDeclaredField()
メソッドがあることに注意してください。
「正当な」ユースケースについては完全にはわかりませんが、これらは特定のことを行う場合に明らかに役立ちます。また、このメソッドファミリーは、クラスで具体的に宣言されたものだけを返し、スーパークラスのためにクラスに存在するものは返しません。
同じ理由で、プライベートコンストラクターへのアクセスも役立つと思います。
「getDeclaredConstructors」メソッドは、クラス内で宣言されたコンストラクタのみを返します。 「getConstructors」メソッドは、クラス内で宣言されていないがスーパークラスから継承されたコンストラクターも返します。
したがって、何をするかによって異なります。適切なアプローチはありません。スーパーコンストラクターも必要かどうかは、本当に重要です。
私はgetDeclaredConstructors
を使用して、コンストラクターがプライベートであるクラスのファクトリーを作成し、システムの「ユーザー」がファクトリーを使用せずにこれらのクラスを直接作成できないようにします。この方法は非常に便利です。