2012-04-05 44 views
1

我不知道是否有一种方法可以做到这一个“简单的方法”,也许有人知道一个解决方案:非法访问扩展javax.swing.text.html.HTMLDocument中

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

所以,我第一次做的是创建一些MyHTMLDocument扩展HTMLDocument,并尝试重写一些方法...当失败时,我尝试用某些方法反思解决问题,但不起作用..因此,经过了解,我已经“复制 - 粘贴所有”HTMLDocument代码作为MyHTMLDocument,(扩展HTMLDocument),改变我需要的东西,并将其放在我自己的“javax.swing.text.html”包中,看起来好像现在工作,但...

...当我终于运行它,我遇到了一些“非法访问错误”,当我打电话给TagActions例如...我越来越沮丧...

请,如果有人可以帮助我,我真的很感激它。


UPDATE:

好吧,让我澄清:

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

公共getReader( INT POS)

公共getReader(INT POS,INT POS,INT popDepth,INT pushDepth,我的HTML.Tag nsertTag)

getReader(INT POS机,POS诠释,诠释popDepth,INT pushDepth,的HTML.Tag insertTag,布尔insertInsertTag)

最后一个,就是非公开或保护。

此外,有一种内在的级称为HTMLReader的,它有3层构造:

公共HTMLReader的(INT偏移)

公共HTMLReader的(INT抵消,诠释popDepth,INT pushDepth,HTML .TAG insertTag)

HTMLReader的(INT抵消,诠释popDepth,INT pushDepth,的HTML.Tag insertTag,布尔insertInsertTag,布尔insertAfterImplied,布尔wantsTrailingNewline)

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

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

} 但我只是不知道如何做到这一点。我甚至尝试了一些反思,它似乎工作的方法,但我无法找到一种方法来做相同的构造函数... 再次感谢。

+0

请码你想做什么表现。由于某种原因,这些方法是非公开的,并且可能还有其他方法来完成您正在尝试执行的操作。以完全抽象的方式讨论这个问题是没有用的。 – 2012-04-05 17:17:38

+0

林不知道总有一个原因......我真的认为至少应该保护这两个......但是,正如你所说,讨论这是无用的。我已经修改了我原来的帖子来解释我正在做的事情。感谢您的回复 – ThanatosMK 2012-04-10 18:31:27

回答

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自己的项目中。没有任何东西可以阻止你,但这种方式后来可能会导致混淆。

无论这种技术是否可以接受,本身就是一个有趣的问题。可能会出现类加载问题,特别是如果您运行的是使用类加载进行游戏的容器。

+0

这是我的第一个想法,即便如此,它并不是那么简单,因为它显示了一个非法访问错误,在HTMLReader中有对javax.swing.text.html.Map类的调用,不公开...和许多其他小问题,比如不能调用一些超级方法,所以为了解决这个问题,我创建了自己的javax.swing.text.html包,并添加了我的类,它扩展了HTMLDocument ,并创建了一个新的HTMLReader innerClass,使用反射来获得私有或默认方法......也许它不是最好的方法......但它的工作原理.. – ThanatosMK 2012-04-12 13:52:29

0

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

在具有相同名称的解决方案创建一个包的使用的一类(比如HTMLDocument的),在这种情况下:“javax.swing.text.html中的”

创建扩展原类(CorrectHTMLDocument)一类

有很多相当事情:所有的民营化成员会引发一个IllegallAccessException异常,所以我使用了HTMLDocument.class的反射来获取它们,并使它们可访问。

要“覆盖”错误HTMLReader的,我复制/粘贴原来的源代码,并把它作为内部类中CorrectHTMLDocument,并使用所描述的相同的技术,解决了IllegalAccessExceptions

有几件事情,还有一些调用像javax.swing.text.html.Map这样的“默认”访问类来解决IllegalAccessError,我再次使用了类的反射,并更改了Object的原始Map声明成员。现在

,它的正常工作......我希望这有助于与同一问题的任何一个......如果有一些...