2012-02-20 3 views
8

SecurityExceptionを投げる:Class.getMethodの作り方()特定のフィールドのオブジェクトのゲッターメソッド(用いた反射)を見つけるために、私はユーティリティメソッドを持つ

public static Method findGetter(final Object object, final String fieldName) { 
    if(object == null) { 
     throw new NullPointerException("object should not be null"); 
    } else if(fieldName == null) { 
     throw new NullPointerException("fieldName should not be null"); 
    } 

    String getterName = getMethodNameForField(GET_PREFIX, fieldName); 

    Class<?> clazz = object.getClass(); 
    try { 
     return clazz.getMethod(getterName); 
    } catch(final NoSuchMethodException e) { 
     // exception handling omitted 
    } catch(final SecurityException e) { 
     // exception handling omitted 
    } 
} 

は、私はユニットテストを書きたいことSecurityExceptionのシナリオをカバーしていますが、どうすればgetMethodをSecurityExceptionをスローすることができますか?セキュリティマネージャ、sが存在すると、次の のいずれかの条件が満たされた場合getMethodは、SecurityExceptionが

をスローします

javadocの状態:s.checkMemberAccessの

  • 呼び出し( this、Member.PUBLIC)は、メソッドへのアクセスを拒否する

  • 呼び出し元のクラスローダーがクラスlの祖先でも祖先でもない s.checkPackageAccess()の現在のクラスおよび呼び出しのためのoaderは、このクラス私はむしろモックフレームワークに頼るよりも、通常は例外をトリガすることを好む

のパッケージへのアクセスを拒否します。

答えて

11
System.setSecurityManager(new SecurityManager(){ 
    @Override 
    public void checkMemberAccess(Class<?> clazz, int which) { 
     throw new SecurityException("Not allowed") 
    } 
    @Override 
    public void checkPermission(Permission perm) { 
     // allow resetting the SM 
    } 
}); 
ClassTest.class.getMethod("foo"); 

元の状態を復元するためにfinallyブロックにSystem.setSecurityManager(null)を呼び出すことを忘れないでください。

+0

ありがとう@Bozho!非常に起こりそうなシナリオですが、簡単にテストできるのはうれしいことです。 –

0

これを通常の設定で行う限り、これが起こる可能性はごくわずかです。

getMethodは特にパブリックメソッドのみを検索するため、非公開のメソッドはNoSuchMethodExceptionとなります。 getDeclaredMethodはこのメソッドを検出しますが、プライベート/保護されたメソッドを返すことができます。

これを行う唯一の本当の方法は、javadocsのように、セキュリティマネージャによって保護された別のパッケージを用意することです。これは、署名されていないアプレットまたは同様のアクセス許可でのみ行うことができます。 (私は決してこれ自身を実行していないので、完全にはわかりません)

セキュリティマネージャをオーバーライドすることによって、特定のメソッドに対して例外がスローされるように強制しています。