我想知道是否有办法以“简单的方式”做到这一点,也许有人知道解决方案:
我正在使用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 {
} 但我只是不知道该怎么做..我甚至尝试了一些反射,它似乎适用于方法,但我找不到一种方法来为构造函数做同样的事情...... 再次感谢。
答案 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声明成员对象
现在,它的工作正常......我希望对任何有相同问题的人都有帮助......如果有的话......