2012-04-05 1 views
1

мне интересно, если есть способ сделать это в «простой путь» и, возможно, кто-то знает решение:Незаконный доступ простирающийся javax.swing.text.html.HTMLDocument

Я работаю с javax. swing.text.html.HTMLDocument, но по какой-то причине, по крайней мере, 2 метода, которые мне нужны, являются непубличными, тем не менее, мне нужно «переопределить» их, изменить несколько вещей, но, в некотором роде, я нужно сохранить класс HTMLDocument, потому что я использую много пакета javax.swing.text.html ...

Итак, что я в первый раз сделал, было создано какое-то приложение MyHTMLDocument, расширяющее HTMLDocument и пытающееся переопределить некоторые методы ... когда это не удалось, я попытался решить его, используя отражение некоторых методов, но не работает .. поэтому, будучи desedperated, я «скопирую - вставляю весь» код HTMLDocument как MyHTMLDocument, (расширяя HTMLDocument), изменяю то, что мне нужно, и помещаю его в свой собственный пакет «javax.swing.text.html», и кажется работать сейчас, но ...

... когда я, наконец, запустил его, я застрял на некоторых ошибках «Незаконного доступа», например, когда я вызываю TagActions ... и я расстраиваюсь ...

, пожалуйста, если кто-то может мне помочь, я очень ценю это.


UPDATE:

Хорошо, позвольте мне уточнить:

В классе javax.swing.text.html.HTMLDocument, вы можете найти три метода:

общественного getReader (int pos)

public getReader (int pos, int pos, int popDepth, int pushDepth, HTML.Tag i nsertTag)

getReader (интермедиат поз, внутр поз, внутр popDepth, внутр pushDepth, HTML.Tag insertTag, логическое insertInsertTag)

последний, не является государственным или защищена.

Кроме того, существует внутренний-класс называется HTMLReader и имеет 3 конструктора:

общественного HTMLReader (INT смещение)

общественного HTMLReader (Int смещения, Int popDepth, Int pushDepth, HTML .tag insertTag)

HTMLReader (Int смещения, Int popDepth, Int pushDepth, HTML.Tag insertTag, булево insertInsertTag, логическое insertAfterImplied, логическое wantsTrailingNewline)

еще один, не публичный.

Что мне нужно сделать, это позвонить по крайней мере, эти два непубличный из моего пользовательского класса: общественного класса MyHTMLDocument расширяет HTMLDocument {

} , но я просто не знаю, как это сделать .. я даже попробовал с некоторым отражением и, похоже, работает для методов, но я не могу найти способ сделать то же самое для конструкторов ... Еще раз спасибо.

+0

Пожалуйста, покажите с кодом, что вы пытаетесь сделать. Методы не являются общедоступными по какой-либо причине, и, вероятно, существуют другие способы достижения того, что вы пытаетесь сделать. Обсуждение этого в совершенно абстрактных терминах бесполезно. –

+0

Я не уверен, что для этого есть все основания ... Я действительно думаю, что по крайней мере эти два должны быть защищены ... но, как вы сказали, обсуждение этого бесполезно. Я уже изменил свое оригинальное сообщение, чтобы немного объяснить, что я делаю. Спасибо за ответ – ThanatosMK

ответ

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 и ее не public ... и много других второстепенных проблем, например, неспособных вызвать некоторые супер методы, поэтому, чтобы решить эту проблему, я создал свой собственный пакет javax.swing.text.html и добавил к нему свой класс, который расширяет HTMLDocument , и создал новый HTMLReader innerClass, используя отражение для получения частных или стандартных методов ... может быть, это не лучший способ ... но он работает .. – ThanatosMK

0

В принципе: Как я уже отметил, что есть способ сделать это ... это не простой путь, но это может быть полезно:

Создание пакета в растворе с тем же именем, что используемый класс (например, HTMLDocument), в данном случае: «javax.swing.text.html»

Создать класс, который расширяет исходный класс (CorrectHTMLDocument)

есть много значительных вещей: Все privated члены вызовет исключение IllegallAccessException, поэтому я использовал отражение над HTMLDocument.class, чтобы получить все из них и сделать их доступными.

К «Override» неправильный HTMLReader, копировать/вставить исходный код, его и положить его в качестве InnerClass в CorrectHTMLDocument, и используя ту же методику, описанную, решить IllegalAccessExceptions

Есть несколько вещей, , есть некоторые призывы к классам доступа по умолчанию, например javax.swing.text.html.Map, чтобы решить проблему IllegalAccessError, я снова использовал отражение над классом и изменил исходные элементы объявления карты для Object.

Теперь, это работает отлично ... Я надеюсь, что это помогает любому с тем же вопросом ... если есть некоторые ...