关于修改final public类的问题,我有一个快速的疑问。根据一些研究,似乎final public类不能被继承或实现。我的目标是在这个final public类中更改一个final static变量。
类名为: public final class Utils
private static final Set<String> DISALLOWED_HEADERS_SET = Set.of(
"authorization", "connection", "cookie", "content-length",
"date", "expect", "from", "host", "origin", "proxy-authorization",
"referer", "user-agent", "upgrade", "via", "warning");
我希望从这个 DISALLOWED_HEADERS_SET 中移除 authorization 字段。有没有做到这一点的方法?
我听说反射是修改类的一种方式。这里有一个指向 GitHub 的链接 Apress/java-9-revealed,它似乎揭示了类的内部情况。
这个问题已被确认为XY问题。我将尝试通过更多信息解释为什么我想要一个解决方案。在深入探讨驱使我提出这个问题的原因之前,我将介绍当前这个问题所处的情况。
重要的是要了解Clevertap已经向Oracle提出了这个问题。如果您跟随Oracle链接,您会看到这个问题已经得到确认并更新到
Jdk 11
。希望Oracle将这个修复源代码应用于即将发布的Java 10
,但鉴于Jdk 9
代表Java 9
的事实,这是极不可能的。也就是说,唯一的解决方案是使用反射,clevertap中的开放线程建议使用它。现在,我将简要解释我已经实现和正在努力解决的问题。 我一直在开发一个框架,使用Java语言发送推送通知到APNs。除了一个功能之外,一切正常运作。
[我将在不久的将来通过GitHub分享这个框架,以便那些想要发送通知到APNs而不依赖于第三方框架(如Jetty,Netty或okhttp)的人使用。]
当我尝试使用令牌作为身份验证的方式发送通知时,问题出现了。我已经成功地按照Apple提供的说明创建了令牌。我所要做的就是使用
authorization
键和bearer <token>
值设置请求头。然而,当我使用从jdk9.incubator.httpclient模块派生的.setHeader
来设置这些值时,它自动省略了这个字段。如上所述,authorization
是DISALLOWED_HEADERS_SET
的一部分,显然不允许使用。如果用户尝试将"authorization"设置为请求头字段的键值,它将被删除。如果您有任何解决这个问题的建议,那将对其他面临同样问题的人非常有用。
坏消息,各位...jdk 9.0.4
已经移除了setSystemHeader
方法,所以如果你想要使用reflection
,你需要使用Jdk 9.0.1
如之前承诺的,我创建了一个基于纯Java代码发送通知的Java库,并将其上传到github。我为发布的应用程序使用了基于jdk10
的旧版本。旧版本仅支持tls连接。现在,基于jdk11
的当前版本支持使用令牌进行身份验证以向APNs发送推送通知。