45

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

import java.lang.reflect.Field;

public class Test {

    public static void main(String[] args) {
        C c = new C();
        try {
            Field f = C.class.getDeclaredField("a");
            f.setAccessible(true);
            Integer i = (Integer)f.get(c);
            System.out.println(i);
        } catch (Exception e) {}
    }
}

class C {
    private Integer a =6;
}

リフレクションを使用してクラスのプライベート フィールドにアクセスできるのは非論理的です。なぜそのような機能が利用できるのですか? そのようなアクセスを許可するのは「危険」ではありませんか?

4

7 に答える 7

60

Privateは、セキュリティメカニズムとしてではなく、偶発的な誤用を防ぐことを目的としています。あなたがそれをバイパスすることを選択した場合、あなたはあなた自身のリスクとあなたが何をしているのかを知っているという仮定でそうすることができます。

于 2009-08-06T15:29:33.503 に答える
22

getDeclaredField()との両方setAccessible()が実際にセキュリティ マネージャーによってチェックされ、コードでこれが許可されていない場合は例外がスローされます。Java コードはセキュリティ マネージャなしで実行されることが多いため、ほとんどの場合、それに気付かないでしょう。

1 つの重要な例外は、常にセキュリティ マネージャーと共に実行されるアプレットです。

于 2009-08-06T15:20:19.870 に答える
10

はい、いいことではありませんが、Java Serialization などのフレームワークを機能させることができます。

リフレクトされたオブジェクトにアクセス可能フラグを設定すると、Java オブジェクトのシリアライゼーションやその他の永続化メカニズムなど、十分な特権を持つ高度なアプリケーションが、通常は禁止される方法でオブジェクトを操作できるようになります。

この機能は次の方法で無効にできると思いますSecurityManager

http://javabeans.asia/2008/10/12/how_to_set_securitymanager_and_java_security_policy_programmatically.html

于 2009-08-06T15:18:14.880 に答える
8

反射は危険です。限目。

安全性をわずかに高めるために、本当に危険なシステムの有用性を制限することに何の意味があるのでしょうか?

また、自動化されたシリアライゼーションには、あらゆるクラスから「頭脳を吸い出す」能力が必要です。この場合、アクセス修飾子を無視する必要があります。

于 2009-08-06T15:16:58.987 に答える
4

リフレクションは、クラス内にアクセスするための完全な API です。プライベート メンバーとすべて。

実行しているコード (アプレットなど) が信頼できない場合は、コードがリフレクションをまったく使用しないようにすることができます。詳細については、このスタック オーバーフローの質問を参照してください。

于 2009-08-06T15:22:03.673 に答える
4

出典: http://java.sun.com/docs/books/tutorial/reflect/

リフレクションは、Java 仮想マシンで実行されているアプリケーションの実行時の動作を調べたり変更したりする機能を必要とするプログラムでよく使用されます。

それは、いくつかのルールを破ることができるツールであり、足元に投げたり、適切に使用したりできます。

于 2009-08-06T15:17:51.403 に答える
3

パッケージの説明から:java.lang.reflect

このパッケージのクラスは、 java.lang.Classデバッガー、インタープリター、オブジェクト インスペクター、クラス ブラウザーなどのアプリケーション、およびオブジェクトのシリアル化や JavaBeans などのサービスに対応し、ターゲット オブジェクトのパブリック メンバー (ランタイム クラスに基づく) または特定のクラスによって宣言されたメンバー。

リフレクションは、クラスとオブジェクト間の通常の対話では通常利用できない手段を通じて、クラスに関する情報にアクセスするためのメカニズムを提供します。その 1 つは、外部のクラスやオブジェクトからのプライベート フィールドへのアクセスを許可することです。

はい、クラスやオブジェクトの内部を公開する可能性があるため、リフレクションは一般的に危険です。

ただし、他の標準的な手段ではアクセスできないクラスやオブジェクトの内部を検査するために使用できる非常に強力なツールでもあります。

于 2009-08-06T15:18:08.780 に答える