重新定义静态最终模式

时间:2014-01-28 17:05:31

标签: java design-patterns open-source

这行代码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");

3 个答案:

答案 0 :(得分:0)

不,我不这么认为。反射不会在这里拯救你(见http://docs.oracle.com/javase/tutorial/reflect/member/fieldTrouble.html),最后一个字段无法更改。例如,如果该字段是一个字符串,则该值将在编译的代码中内联,因此更改它可能会造成灾难...... 所以你的选择是给维护者施加压力或分叉代码。

答案 1 :(得分: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

答案 2 :(得分:0)

创建您自己的com.google.api.client.auth.oauth2.BearerToken类,并确保它所在的JAR / WAR /文件夹位于原始库之前的ClassPath 中。因此,你可以放下它。我相信即使是原始的图书馆也可能会使用它。 (请检查出来。)

注意:您可以在同一个包中创建一个类,但在另一个物理文件夹/目录中创建一个类。因此你可以例如在别人的包中访问包私有(默认访问)字段。当JVM在运行时搜索要加载的类时,它会按给定的顺序搜索类路径。使用该类的第一次出现。