2015-10-16 2 views
8

リフレクションを使用するときに注意する必要がある潜在的な問題は何ですか。 私は反射で非常に混乱しています、なぜjavaはプライベートデータメンバーにアクセスするためにこのタイプの機能性を提供しますか?プライベートはプライベートなのですが、なぜリフレクションを使用してプライベートメソッドにアクセスするための機能を提供するのですか?

プライベート: 私は、それが宣言されている唯一のクラスがそれを見ることができると思いたいよう。

なぜ他のクラスのプライベートなものにアクセスできるのですか? この用語(リフレクション)は、私のプライベート(アクセス指定子)プロパティの概念をJavaで完全にオーバーフローします。

このトピックに関する多くのリンクを訪問しましたが、このトピックに関する完全な説明はありません。 例:

package example; 

import java.lang.reflect.Method; 

class A{ 
    private void privateMethod(){ 
     System.out.println("hello privateMethod()"); 
    } 
} 
class B{ 
    public static void main(String[] args) throws Exception { 
     A d = new A(); 
     Method m = A.class.getDeclaredMethod("privateMethod");  
     m.setAccessible(true); 
     m.invoke(d); 
    } 
} 

このアプローチのシナリオについて詳しく説明してください。 他のクラスのプライベートメソッドのアクセシビリティの利点と欠点が必要ですか?

+11

http://stackoverflow.com/questions/1239581/why-is-it-allowed-to-access-java-private-fields-via-reflection –

+1

ほとんどの通常のプロジェクトでは、反射は必要ありません。単にあなたのアーキテクチャについて再考する必要があります(もちろん例外があります)。私は定期的に反射を使用する1つの場所ですが、UnitTestsにあります。 UnitTestのリフレクションを使用してプライベートフィールドを変更するだけで、複数のシナリオを試すことができます。たとえばブール値です。ブール値設定があり、UnitTestの両方のシナリオをテストしたいとします。プロジェクトのデフォルトはfalseなので、最初にテストします。そして、リフレクションを使って(一時的に)それを真にして、もう一方のシナリオをテストします。 –

+0

どのような例で説明できますか?それは私のコンセプトについて非常に明確になるからです。 –

答えて

1

すべての "プライベート"と他の宣言形式は開発ツールのフラグであり、問​​題のフィールドやメソッドの使い方を知るためのものです。これは、開発ツールが意図していない方法でこれらのクラス/フィールド/メソッドを使用するとき、開発者が警告またはエラーを開発者に与えることができるようにするためです。

リフレクションは、開発者が意図していない方法でクラス/フィールド/メソッドを使用していることを示すこれらのフラグを無視または迂回させるツールです。だから一般的に反射は悪いアーキテクチャを示しています。

したがって、プライベートまたはパブリックまたはスタティックとして何かを宣言することには「利点または欠点」はありません。開発者が特別な方法でクラス/フィールド/メソッドにアクセス/使用できるようにするだけで、コードをきれいにして区画化しておくのに役立つツールです。

+3

これは間違っています。セキュリティー・マネージャーが存在する場合、JVMはアクセシビリティーを強化します(反射的な回避策を無効にする)。これが "ちょうど"コンパイル時のヒントであると言うのは間違っています。セキュリティマネージャがデフォルトで有効になっていない(SMの存在下でアプリケーションを構築するのが難しい)ということだけです。これらのリフレクション機能は、シリアライゼーションのようなフレームワーク、分散オブジェクトキャッシュ、永続フレームワーク、モックフレームワークなどの非常に有用なフレームワークで使用されます。 –

1

ほとんどの状況では、アクセス修飾子は、コードの一部を人に見せないようにするためのものです。リフレクションを使用してプライベートメソッドにアクセスする機能は、ツールの観点から有用です。 Javaには、この機能を無効にするセキュリティメカニズムがあります。このsiteには、リフレクションに関連するJavaセキュリティモデルに関する情報があります(ページの下部)

これは本当にあなたのコードが信頼できないコードで実行される状況でのみ重要です。他の開発者があなたのコードにアクセスしたり、あなたのライブラリを持っているならば、セキュリティマネージャーや修飾子を変更しなくてもコードを実行させることはできません。これは制御された環境でのみ有効です。

関連する問題