非法访问扩展javax.swing.text.html.HTMLDocument

时间:2012-04-05 17:02:45

标签: java dom illegalaccessexception

我想知道是否有办法以“简单的方式”做到这一点,也许有人知道解决方案:

我正在使用javax.swing.text.html.HTMLDocument类,但由于某种原因,我需要的至少2个方法是非公开的,即便如此,我需要“覆盖”它们,以更改很少的东西,但是,在某种程度上,我需要保留HTMLDocument类,因为我使用了很多包javax.swing.text.html ...

所以,我第一次做的是创建一些MyHTMLDocument扩展HTMLDocument,并尝试覆盖一些方法......当失败时,我尝试使用某些方法的反射解决它,但是没有工作..所以,正在desesperated,我“复制 - 粘贴所有”HTMLDocument代码作为MyHTMLDocument,(扩展HTMLDocument),改变我需要的东西并把它放在我自己的“javax.swing.text.html”包中,它似乎现在有效,但是......

...当我最终运行它时,我会遇到一些“非法访问错误”,当我打电话给TagActions时......我感到很沮丧......

拜托,如果有人可以帮助我,我非常感激。


更新:

好的,让我澄清一下:

在类javax.swing.text.html.HTMLDocument上,您可以找到三种方法:

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

公共HTMLReader(int offset)

public HTMLReader(int offset,int popDepth,int pushDepth,HTML.Tag insertTag)

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

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

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

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

2 个答案:

答案 0 :(得分: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内部。没有什么可以阻止你,但这种方式可能会引起混乱。

这种技术是否可以接受本身就是一个有趣的问题。可能存在类加载问题,尤其是当您在一个使用类加载来玩游戏的容器中运行时。

答案 1 :(得分:0)

基本上:正如我已经评论过的,有一种方法可以做到这一点......这不是一种简单的方法,但它可能会有所帮助:

在解决方案中创建一个与使用的类名称相同的包(例如HTMLDocument),在本例中为:“javax.swing.text.html”

创建一个扩展原始类的类(CorrectHTMLDocument)

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

要“覆盖”错误的HTMLReader,我复制/粘贴原始源代码,并将其作为内部类放在CorrectHTMLDocument中,并使用相同的技术描述,解决IllegalAccessExceptions

有一些事情,有一些调用“默认”访问类,如javax.swing.text.html.Map,来解决IllegalAccessError,再次,我使用了对类的反射并更改了原始的Map声明成员对象

现在,它的工作正常......我希望对任何有相同问题的人都有帮助......如果有的话......