Java リフレクションはカプセル化をバイパスしてプライベート フィールドにアクセスできますか?

Susan Sarandon
リリース: 2024-11-01 20:11:29
オリジナル
336 人が閲覧しました

Can Java Reflection Bypass Encapsulation to Access Private Fields?

Java リフレクションを介してアクセス可能なプライベート フィールド

リフレクションを介したプライベート フィールドへのアクセスは、Java プログラミングで議論されているトピックです。この手法を使用すると、カプセル化によって課せられるアクセス制限をバイパスしてプライベート フィールドの値を取得できるため、カプセル化原則の違反に関する懸念が生じます。

次の例を考えてみましょう:

class Test
{
    private String str;
    public void setStr(String value)
    {
        str = value;
    }
}
ログイン後にコピー

疑問が生じます: リフレクションを使用してプライベート フィールド 'str' の値を取得することは可能ですか?

答え:

はい、可能です。適切なセキュリティ権限が付与されていれば、実際にそれは可能です。 Field.setAccessible(true) メソッドを利用すると、別のクラスからプライベート フィールドへのアクセスを許可できます。

次のコード スニペットは、これを実現する方法を示しています。

import java.lang.reflect.*;

class Other
{
    private String str;
    public void setStr(String value)
    {
        str = value;
    }
}

class Test
{
    public static void main(String[] args)
        // Just for the ease of a throwaway test. Don't
        // do this normally!
        throws Exception
    {
        Other t = new Other();
        t.setStr("hi");
        Field field = Other.class.getDeclaredField("str");
        field.setAccessible(true);
        Object value = field.get(t);
        System.out.println(value);
    }
}
ログイン後にコピー

注意:

一般的なシナリオでは、プライベート フィールドにアクセスすることは強くお勧めできません。これを行うと、クラスのカプセル化メカニズムが無視され、重要な検証チェックがオーバーライドされたり、他のフィールドが予期せず変更されたりする可能性があります。

以上がJava リフレクションはカプセル化をバイパスしてプライベート フィールドにアクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート