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 类上,您可以找到三个方法:

公共getReader(int pos)

公共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 个构造函数:

公共 HTMLReader(int 偏移量)

公共 HTMLReader(int 偏移量,int popDepth,int pushDepth,HTML.Tag insertTag)

HTMLReader(int offset, int popDepth, int pushDepth, HTML.Tag insertTag, boolean insertInsertTag, boolean insertAfterImplied, boolean wantTrailingNewline)

再次,最后一个,是非公开的。

我需要做的是从我的自定义类中至少调用这两个非公共类: public class MyHTMLDocument extends HTMLDocument{

但我只是不知道该怎么做..我什至尝试了一些反射,它似乎适用于方法,但我找不到对构造函数做同样的方法......再次感谢。

4

2 回答 2

1

这些方法都是包私有的,这就是为什么你无法使用它们。鉴于源代码中的评论,我同意这可能是一个错误:

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)

有很多重要的事情:所有私有成员都会引发 IllegalAccessException,所以我使用 HTMLDocument.class 上的反射来获取所有这些并使其可访问。

为了“覆盖”错误的 HTMLReader,我复制/粘贴了它的原始源代码并将其作为 innerClass 放入 CorrectHTMLDocument 中,并使用所描述的相同技术解决了 IllegalAccessExceptions

There are a few things, there are some calls to "default" access classes like javax.swing.text.html.Map, to solve the IllegalAccessError, again, I used reflection over class and changed the original Map declaration members for Object.

Now, it's working fine... I hope it helps to any one with same issue... if there are some...

于 2012-04-12T14:10:05.703 回答