【问题标题】:Illegal Access extending javax.swing.text.html.HTMLDocument非法访问扩展 javax.swing.text.html.HTMLDocument
【发布时间】:2012-04-19 10:39:44
【问题描述】:

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

我正在使用 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)

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 wantTrailingNewline)

同样,最后一个是非公开的。

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

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

【问题讨论】:

  • 请用代码显示你想要做什么。出于某种原因,这些方法是非公开的,并且可能还有其他方法可以完成您正在尝试做的事情。用完全抽象的术语讨论这个是没有用的。
  • 我不太确定总有一个原因......我真的认为至少这两个应该受到保护......但是,正如你所说,讨论这个是没有用的。我已经修改了我原来的帖子来解释我在做什么。感谢回复

标签: java dom illegalaccessexception


【解决方案1】:

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

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。没有什么能阻止你,但这样会在以后造成潜在的混乱。

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

【讨论】:

  • 这是我的第一个想法,即便如此,也不是那么简单,因为它显示了非法访问错误,在HTMLReader上,有对javax.swing.text.html.Map的调用类,它不是公共的......还有很多其他小问题,比如不能调用一些超级方法,所以,为了解决这个问题,我创建了自己的 javax.swing.text.html 包,并添加了我的扩展 HTMLDocument 的类,并创建了一个新的 HTMLReader innerClass,使用反射来获取私有或默认方法......也许它不是最好的方法......但它可以工作......
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 2012-01-10
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多