Joh*_*ohn 5 java reflection apple-push-notifications java-9 java-11
我有一个关于修改最终公共课的快速问题.基于一些研究,似乎最终的公共类不能被继承或实现.我的目标是在最终的公共类中更改一个最终的静态变量.
类名是: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");
Run Code Online (Sandbox Code Playgroud)
我想摆脱authorization这个领域DISALLOWED_HEADERS_SET.有没有办法做到这一点?
我听说反射是修改类的一种方法.这是一个Apress/java-9-向github 透露,似乎揭示了类内部的内容
该线程(问题)已被识别为XY问题.我将尝试解释为什么我想要解决上述问题的更多信息.在深入研究驱使我提出这个问题的原因之前,我将介绍目前这个问题所在的现状.
要明白,这个问题已经被提出已经是很重要的Clevertap到甲骨文.如果您使用Oracle链接,则可以看到此问题已得到确认并更新为Jdk 11.希望Oracle将这个固定的源代码应用到即将到来的Java 10,但鉴于Jdk 9代表的事实,它是极不可能的Java 9.这就是说,只有解决方案是使用反射,这是clevertap中的开放线程所暗示的.
现在,我将简要解释一下我所取得的成就并试图找出答案.我一直致力于开发一个框架,用于使用Java语言将推送通知发送到APN.一切都有效,除了一个功能.
[ 我将在不久的将来通过GitHub分享这个框架,以便那些试图向APN发送通知而不依赖于第三方框架,例如Jetty,Netty或okhttp.]
当我尝试使用令牌作为身份验证方式发送通知时,问题就出现了.我已经通过Apple提供的指令成功创建了令牌跟踪.我所要做的就是使用authorization键和bearer <token>值设置请求标头.但是,当我使用.setHeader从jdk9.incubator.httpclient模块派生来设置这些值时,它会自动省略此字段.如前所述,authorization是其中的一部分,DISALLOWED_HEADERS_SET显然是不允许的.如果用户尝试将"授权"设置为请求标头字段的键值,则会将其删除.如果您有任何建议可以解决此问题.对于面临同样问题的其他人来说,这将是非常有用的.
坏消息的人... jdk 9.0.4删除setSystemHeader方法,所以如果你想使用reflection,你需要使用Jdk 9.0.1
正如之前所承诺的那样,我创建了java库,用于使用纯Java代码发送通知并将其推送到github.我使用的旧版本基于jdk10我发布的应用程序.旧版本仅支持tls连接.现在基于的当前版本jdk11支持基于tls和令牌的认证,用于向APN发送推送通知.
我不清楚您将通过继承实现什么目标,因为该值是静态的。但是,如果您可以重新编译您的应用程序,您是否考虑过对象组合?这可以替代继承,并且通常用于在最终类或“多重”继承的情况下模拟多态行为。如果您可以“注入”新类而不是原始类(最终类),则可以编写一个包含最终类实例的新类并将其方法委托给它们。无需创建相同的最终静态变量。