1

これを「簡単な方法」で行う方法があるかどうか疑問に思っており、おそらく誰かが解決策を知っています:

私はjavax.swing.text.html.HTMLDocumentクラスで作業していますが、何らかの理由で、必要な少なくとも2つのメソッドが非公開であるため、それらを「オーバーライド」していくつか変更する必要があります.しかし、何らかの方法で HTMLDocument クラスを保持する必要があるのは、javax.swing.text.html パッケージを大量に使用しているためです...

だから、私が最初にやったのは、MyHTMLDocument を作成して HTMLDocument を拡張し、いくつかのメソッドをオーバーライドしようとしたことです...それが失敗したとき、いくつかのメソッドでリフレクションを使用して解決しようとしましたが、機能していません..だから、必死になって、私はHTMLDocumentコードをMyHTMLDocumentとして「すべてコピーして貼り付け」(HTMLDocumentを拡張)し、必要なものを変更して自分の「javax.swing.text.html」パッケージに配置しましたが、今のところは機能しているようですが.. .

...最終的に実行すると、たとえばTagActionsを呼び出すと、「不正アクセスエラー」が発生し、イライラします...

誰かが私を助けてくれたら、本当に感謝しています。


アップデート:

わかりました、明確にしましょう:

クラス javax.swing.text.html.HTMLDocument には、次の 3 つのメソッドがあります。

public getReader(int pos)

public getReader(int pos, int pos, int popDepth, int pushDepth, HTML.Tag insertTag)

getReader(int pos, int pos, int popDepth, int pushDepth, HTML.Tag insertTag, boolean insertInsertTag)

最後のものは非公開または保護されています。

また、HTMLReader と呼ばれる内部クラスがあり、3 つのコンストラクターがあります。

public HTMLReader(int オフセット)

public HTMLReader(int オフセット、int popDepth、int pushDepth、HTML.Tag insertTag)

HTMLReader(int オフセット, int popDepth, int pushDepth, HTML.Tag insertTag, boolean insertInsertTag, boolean insertAfterImplied, boolean wantTrailingNewline)

繰り返しますが、最後のものは非公開です。

私がする必要があるのは、カスタム クラスから少なくとも次の 2 つの非パブリックを呼び出すことです: public class MyHTMLDocument extends HTMLDocument{

} しかし、私はそれを行う方法がわかりません..リフレクションを試してみましたが、メソッドでは機能するように見えますが、コンストラクターで同じことを行う方法が見つかりません...ありがとう。

4

2 に答える 2

1

これらのメソッドは両方ともpackage privateであるため、アクセスできません。ソースのコメントを考えると、バグである可能性があることに同意します。

356       /**
357        * Fetches the reader for the parser to use to load the document
358        * with HTML.  This is implemented to return an instance of
359        * HTMLDocument.HTMLReader.  Subclasses can reimplement this
360        * method to change how the document get structured if desired
361        * (e.g. to handle custom tags, structurally represent character
362        * style elements, etc.).
363        *
             ...

本当にこれをやりたい場合はjavax.swing.text.html、独自のプロジェクト内に配置できます。あなたを止めるものは何もありませんが、そのようにすると、後で混乱する可能性があります.

その手法が受け入れられるかどうかは、それ自体が興味深い問題です。クラスローディングでゲームをプレイするコンテナで実行している場合は特に、クラスローディングの問題が発生する可能性があります。

于 2012-04-10T19:08:09.660 に答える
0

基本的に:私がすでにコメントしたように、それを行う方法があります...簡単な方法ではありませんが、それは役立つかもしれません:

使用するクラスと同じ名前(HTMLDocumentなど)でソリューションにパッケージを作成します。この場合は「javax.swing.text.html」です。

元のクラスを拡張するクラスを作成します(CorrectHTMLDocument)

かなりのことがたくさんあります。すべてのプライベートメンバーがIllegallAccessExceptionを発生させるので、HTMLDocument.classを介したリフレクションを使用してすべてを取得し、アクセス可能にしました。

間違ったHTMLReaderを「オーバーライド」するには、元のソースコードをコピーして貼り付け、CorrectHTMLDocumentにinnerClassとして配置し、説明したのと同じ手法を使用してIllegalAccessExceptionsを解決します。

IllegalAccessErrorを解決するために、javax.swing.text.html.Mapなどの「デフォルト」アクセスクラスへの呼び出しがいくつかあります。ここでも、クラスに対するリフレクションを使用して、Objectの元のMap宣言メンバーを変更しました。

今、それはうまく機能しています...私はそれが同じ問題を抱えている人に役立つことを願っています...何かがあれば...

于 2012-04-12T14:10:05.703 に答える