2011-09-27 8 views
22

リフレクションを使用してJavaのプライベートメソッドとコンストラクタにアクセスするように開発者を制限するにはどうすればよいですか?リフレクションを使用してJavaのプライベートメソッドとコンストラクタにアクセスするように開発者を制限するにはどうすればよいですか?

通常のJavaコードを使用して、プライベートコンストラクタやクラス外のプライベートメソッドにアクセスすることはできません。しかし、リフレクションを使用することで、Javaクラスの任意のプライベートメソッドとコンストラクタにアクセスできます。

Javaコードにどのようにセキュリティを与えることができますか?

+0

これは署名の瓶を持っているための良い選択肢だろう。 "いかなる状況下でも、このjarファイル内のクラスに対するリフレクションを許可する"。しかし、私はそのような特徴はないと思う。 – Thilo

答えて

2

あなた(問題のコードの開発者として)はこれを行うことはできません。

アプリケーションを実行するエンドユーザーは、リフレクションを禁止するSecurityManagerをインストールできます。

+0

彼はもちろんです。彼は、アプリケーションの開始時にセキュリティマネージャをインストールします。 –

+0

彼はアプリケーションの開発者でなければ、これはオプションではありません。私は、彼が「開発者(おそらくアプリケーションの)にリフレクションを使用するように制限したい」というケースについて、自分が秘密にしたいと思う方法に対してもっと考えていました。 – Thilo

+0

セキュリティマネージャをインストールするクラスで静的初期化子を使用できないのはなぜですか?そして、もし彼がそれをインストールできないならば、クラスラッピングを防止する例外がありますか? –

6

プライベートメソッド/コンストラクタのすべてにcheckPermission()メソッドを追加します。 checkPermission sun.reflect.Reflection.getCallerClass(int n) by assert callerClass=selfClass

getCallerClassは、realFramesToSkipフレームのクラスをスタック(ゼロベース)に戻し、java.lang.reflect.Method.invoke()に関連付けられたフレームとその実装を無視します。最初のフレームはこのメソッドに関連付けられているフレームなので、getCallerClass(0)sun.reflect.ReflectionのClassオブジェクトを返します。

public class PrivateConstructorClass { 

    private PrivateConstructorClass() { 
     checkPerMission(); 
       //you own code go below 
    } 

    void checkPerMission() { 
     Class self = sun.reflect.Reflection.getCallerClass(1); 
     Class caller = sun.reflect.Reflection.getCallerClass(3); 
     if (self != caller) { 
      throw new java.lang.IllegalAccessError(); 
     } 
    } 
} 

あなたが反映テストしようとすることができ、それは失敗します。

public class TestPrivateMain { 

    Object newInstance() throws Exception { 

     final Class<?> c = Class.forName("package.TestPrivate"); 

     final Constructor<?> constructor = c.getDeclaredConstructor(); 
     constructor.setAccessible(true); 
     return constructor.newInstance(); 

    } 

    public static void main(String[] args) throws Exception { 
     Object t = new TestPrivateMain().newInstance(); 
    } 
} 
+2

-1:sun.reflect.Reflection ...のような不安定なAPIを呼び出すため... –

+2

うーん...しかし、実際には私の意見では本当に良い試みだった...不安定なAPIの最初にそこにいて –

関連する問題