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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 20:11:29249ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。