2014-01-28 45 views
2

此行代碼https://code.google.com/p/google-oauth-java-client/source/browse/google-oauth-client/src/main/java/com/google/api/client/auth/oauth2/BearerToken.java#44包含一個錯誤。重新定義靜態最終模式

INVALID_TOKEN_ERROR正則表達式是錯誤的,並沒有機會,即mantainers將盡快修復它。

除了分叉圖書館,有沒有一種方法可以在我自己的代碼中安全地重新定義它?

牽連代碼遵循誰不希望打開鏈接:

public class BearerToken { 
    [...] 
    static final Pattern INVALID_TOKEN_ERROR = Pattern.compile("\\s*error\\s*=\\s*invalid_token"); 
+0

使用[反射](http://stackoverflow.com/questions/3301635/change-private-static-final-field-using-java-reflection)。鏈接的例子是一個「私人」字段,所以你可以忽略它。 – GriffeyDog

回答

0

不,我不這麼認爲。反射並不會拯救你(見http://docs.oracle.com/javase/tutorial/reflect/member/fieldTrouble.html),最後一個字段不能改變。例如,如果該字段是字符串,則該值將在編譯後的代碼中內聯,因此更改它可能會造成災難......因此,您的選擇是向維護者施加壓力或分叉代碼。

0

儘管無法替換Pattern對象,因爲它是最終的對象,所以可以使用反射操作對象INVALID_TOKEN_ERROR的成員字段。

更新私有字段String pattern,然後調用私有方法compile()INVALID_TOKEN_ERROR

如何更新私有變量:Changing private final fields via reflection

如何調用一個私有方法:How to call a private method from outside a java class

+0

這很有趣,你介意用示例代碼想法擴展一點回復嗎? Java noob在這裏。謝謝。 –

+0

我添加了問題的鏈接,告訴你如何做到這一點。 – JustinKSU

0

創建您自己的com.google.api.client.auth.oauth2.BearerToken並確保它所在的JAR/WAR /文件夾位於原始庫的之前的ClassPath 中。因此你可能會滑倒它。我相信即使是最初的圖書館也可能會使用它。 (請查看。)

注意:您可以在同一個包中但在另一個物理文件夾/目錄中創建一個類。因此你可以例如訪問其他軟件包中的軟件包私人(默認訪問)字段。當JVM在運行時搜索要加載的類時,它會按給定順序搜索類路徑。使用該類的第一次出現。