2013-03-21 63 views
2

Java中有沒有一種方法可以通過反射或其他方式從其相應的重寫方法中訪問在超類方法中聲明的局部變量子類?從子類中的重寫方法中訪問超類方法中的局部變量

具體來說,我正在使用Spring Security的DefaultLdapAuthoritiesPopulator。這個類有一個名爲getAdditionalRoles的方法,文檔中說子類可以重寫以返回用戶的額外角色。

該課程還實施getGrantedAuthorities方法,該方法實際上調用getAdditionalRoles方法。源代碼看起來是這樣的:

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

    Set extraRoles = getAdditionalRoles(user, username); 

    ... 
} 

此方法調用getGroupMembershipRoles,這確實爲這個用戶,並將其存儲在一個名爲roles一個局部變量定義的組LDAP搜索。現在在執行getAdditionalRoles時,我還需要訪問在LDAP中爲此用戶定義的組,因此我可以推斷此用戶的其他角色。出於商業原因,我無法直接在LDAP中定義這些附加角色。

我可以簡單地繼續前進,實現LdapAuthoritiesPopulator我自己,但我想知道如果有周圍的一些其他的方式,因爲我真正需要的是訪問roles局部變量在父類的方法,以避免我不得不做第二個LDAP搜索。

+1

難道你不能重寫'getGroupMembershipRoles()'? – Zutty 2013-03-21 17:02:42

+0

好點。我可以做到。出於某種原因,我的印象是該方法在父項中被宣佈爲最終。這樣可以減少複製/粘貼而不是重做整個班級。 – Jeshurun 2013-03-21 17:04:01

回答

2
  1. 您不能訪問其他方法中的變量,因爲方法中的變量在方法返回後被刪除。因爲變量是堆棧。
  2. 如果可能,您可以覆蓋getGroupMembershipRoles並將groups存儲爲屬性,並以其他方式訪問它。
1

可能你可以利用AOP並把修改後建議getGroupMembershipRoles(userDn, username);並修改返回的角色。

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; 

} 
0

我不認爲你可以從任何方法(誰的價值方法不返回),這是目前在其他一些遠程類訪問本地變量的數據。在這種情況下,即使反射也無濟於事。如果我錯了或遺漏了任何東西,請糾正我。

相關問題