2012-04-05 51 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聲明成員。現在

,它的正常工作......我希望這有助於與同一問題的任何一個......如果有一些...