2

Javaには、リフレクションまたはその他の手段を介して、サブクラスの対応するオーバーライドされたメソッドからスーパークラスのメソッドで宣言されたローカル変数にアクセスする方法がありますか?

具体的には、SpringSecurityので作業していDefaultLdapAuthoritiesPopulatorます。このクラスには、getAdditionalRolesサブクラスがユーザーに追加のロールを返すためにオーバーライドできるとドキュメントに記載されている名前のメソッドがあります。

getGrantedAuthoritiesこのクラスは、実際にメソッドを呼び出すメソッドも実装しgetAdditionalRolesます。ソースコードは次のようになります。

public final GrantedAuthority[] getGrantedAuthorities(DirContextOperations user, String username) {
    ...
    Set roles = getGroupMembershipRoles(userDn, username);

    Set extraRoles = getAdditionalRoles(user, username);

    ...
}

このメソッドはgetGroupMembershipRoles、を呼び出します。これは、このユーザーに対して定義されたグループのLDAP検索を実行し、それを。という名前のローカル変数に格納しますroles。の実装ではgetAdditionalRoles、LDAPでこのユーザーに定義されたグループにもアクセスする必要があるため、このユーザーの追加の役割を推測できます。ビジネス上の理由から、これらの追加の役割をLDAPで直接定義することはできません。

単純に先に進んでLdapAuthoritiesPopulator自分で実装することもできますが、実際に必要なのはroles、2回目のLDAP検索を行わなくても済むように、親クラスのメソッドのローカル変数にアクセスすることだけなので、他の方法があるのではないかと考えていました。

4

4 に答える 4

2
  1. メソッドが返された後にメソッド内の変数が削除されるため、他のメソッド内の変数にアクセスすることはできません。変数がスタックにあるためです。
  2. 可能であれば、オーバーライドgetGroupMembershipRolesgroupsてプロパティとして保存し、別の方法でアクセスできます。
于 2013-03-22T02:21:29.087 に答える
1

おそらく、AOP を活用してAfter Retuning AdviceをオンにgetGroupMembershipRoles(userDn, username);し、返されたロールを変更することができます。

于 2013-03-21T17:03:31.227 に答える
1

私は Zutty のアドバイスを受けて、次のように実装しました。

@Override
public Set<GrantedAuthority> getGroupMembershipRoles(String userDn,
        String username) {
    Set<GrantedAuthority> authorities = super.getGroupMembershipRoles(userDn, username);

    // My app's logic by inspecting the authorities Set

    return authorities;

}
于 2013-03-21T17:11:01.007 に答える
0

他のリモートクラスに存在するメソッド(値メソッドが返されない)からローカル変数からデータにアクセスできるとは思いません。この場合、反射でさえ役に立ちません。私が間違っているか、何かを見逃している場合は、私を修正してください。

于 2013-03-21T17:12:46.423 に答える