final パブリック クラスの変更に関して簡単な質問があります。いくつかの調査に基づいて、最終的なパブリック クラスは継承または実装できないようです。私の目標は、この最終パブリック クラス内の 1 つの最終静的変数を変更することです。
クラス名は: 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");
authorization
this から field を取り除きたいですDISALLOWED_HEADERS_SET
。これを行う方法はありますか?
リフレクションはクラスを変更する 1 つの方法だと聞きました。これはApress/java-9-revealedを github に公開したもので、クラスの内部が明らかになるようです
このスレッド (質問) は XY 問題として識別されています。上記の問題の解決策が必要な理由について、詳細を説明してみます。この質問をするようになった理由を掘り下げる前に、この問題が現在どこにあるのかという現在の状況について説明します。
この問題はClevertap to Oracleによってすでに引き起こされていることを理解することが重要です。Oracle のリンクをたどると、この問題が認識され、 に更新されていることがわかりますJdk 11
。オラクルがこの修正されたソース コードを次の に適用することを願っていますが、 が を表すJava 10
という事実を考えると、その可能性は非常に低いです。そうは言っても、クレバータップのオープンスレッドが示唆するリフレクションを使用することが唯一の解決策です。Jdk 9
Java 9
ここで、私が達成したことと理解しようとしていることを簡単に説明します。Java 言語を使用してプッシュ通知を APNs に送信するために開発しているフレームワークに取り組んでいます。1つの機能を除いてすべてが機能します。
[ Jetty、Netty、okhttp などのサードパーティ フレームワークに依存せずに APNs に通知を送信しようとしている人のために、近い将来、このフレームワークを GitHub を通じて共有します。]
通知を送信するための認証方法としてトークンを使用しようとすると、問題が発生します。Appleから提供された指示に従って、トークンの作成に成功しました。私がしなければならないのは、リクエストヘッダーにauthorization
キーとbearer <token>
値を設定することだけです。ただし、jdk9.incubator.httpclient.setHeader
モジュールから派生したものを使用してこれらの値を設定すると、このフィールドは自動的に省略されます。前述のように、は一部であり、明らかに許可されていません。ユーザーがリクエスト ヘッダー フィールドのキー値として「承認」を設定しようとすると、それは削除されます。この問題を回避するための提案があれば。同じ問題に直面している他の人にとっては素晴らしく、役立つでしょう。authorization
DISALLOWED_HEADERS_SET
悪い知らせです...メソッドがjdk 9.0.4
削除されsetSystemHeader
たので、使用したい場合は使用reflection
する必要がありますJdk 9.0.1
以前お約束したように、Pure Java コードを使用して通知を送信するための Java ライブラリを作成し、githubにプッシュしました。jdk10
公開したアプリに基づいた古いバージョンを使用しました。古いバージョンは TLS 接続のみをサポートしていました。に基づく現在のバージョンjdk11
は、APN にプッシュ通知を送信するための tls とトークン ベースの認証の両方をサポートしています。