2012-04-05 12 views
1

Ich frage mich, ob es ein Weg, dies in einem „einfachen Weg“ zu tun und vielleicht kennt jemand eine Lösung:illegaler Zugriff erstreckt javax.swing.text.html.HTMLDocument

ich mit javax arbeiten bin. swing.text.html.HTMLDocument-Klasse, aber aus irgendeinem Grund, mindestens 2 Methoden, die ich brauche, sind nicht öffentlich, trotzdem muss ich sie "überschreiben", um ein paar Dinge zu ändern, aber in gewisser Weise, ich muss die HTMLDocument-Klasse behalten, weil ich eine Menge des Pakets javax.swing.text.html verwende ...

Also, was ich zuerst mache, war einige MyHTMLDocument erstellen erweitert HTMLDocument, und versucht, einige Methoden zu überschreiben ... als das fehlschlug, habe ich versucht, es mit Reflektion über einige Methoden zu lösen, funktioniert aber nicht .. so, dass ich este, habe ich "copy-paste all" HTMLDocument-Code als MyHTMLDocument, (HTMLDocument erweitern), ändern, was ich brauchte und es in meinem eigenen "javax.swing.text.html" -Paket, und es scheint um jetzt zu arbeiten, aber ...

... wenn ich es endlich laufen lasse, stehe ich auf einigen "Illegal Access errors" fest, wenn ich zum Beispiel TagActions anrufe ... und ich werde frustriert ...

bitte, wenn jemand mir helfen könnte, ich schätze es wirklich sehr.


UPDATE:

Ok, lassen Sie mich klarstellen:

Auf der Klasse javax.swing.text.html.HTMLDocument, können Sie drei Methoden finden:

öffentlichen getReader (int pos)

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

getReader (int pos, int pos, int popDepth, int pushDepth, HTML.Tag InsertTag, boolean insertInsertTag)

der letzte, ist nicht öffentlich oder geschützt.

Außerdem gibt es eine innere Klasse HTMLReader genannt und hat 3 Konstrukteure:

public HTMLReader (int offset)

öffentliche 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)

wieder das letzte, ist nicht öffentlich.

Was muss ich tun, ist aus meiner benutzerdefinierten Klasse zumindest diese zwei nicht-öffentlich zu nennen: public class MyHTMLDocument erweitert Htmldocument {

} aber ich nicht nur wissen, wie es zu tun .. Ich selbst versucht mit etwas Reflexion und es scheint, für Methoden zu arbeiten, aber ich kann einen Weg nicht finden, dasselbe für Erbauer zu tun ... Danke wieder.

+0

Bitte zeigen Sie mit dem Code, was Sie versuchen zu tun. Die Methoden sind aus einem bestimmten Grund nicht öffentlich, und es gibt wahrscheinlich andere Möglichkeiten, um das zu erreichen, was Sie versuchen. Es ist nutzlos, dies völlig abstrakt zu diskutieren. –

+0

Ich bin mir nicht so sicher, dass es immer einen Grund dafür gibt ... Ich denke wirklich, dass zumindest diese beiden geschützt werden sollten ... aber wie du gesagt hast, ist es nutzlos, darüber zu diskutieren. Ich habe bereits meinen ursprünglichen Beitrag geändert, um etwas mehr zu erklären, was ich mache. Danke für die Antwort – ThanatosMK

Antwort

1

Diese Methoden sind beide Paket privat, weshalb Sie nicht zu ihnen gelangen können. Ich bin damit einverstanden, dass es vielleicht ein Fehler sein, die Kommentare in der Quelle angegeben:

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  * 
      ... 

Wenn Sie wirklich wollten, dies zu tun, können Sie es in javax.swing.text.html in Ihrem eigenen Projekt setzen könnten. Es gibt nichts, was dich daran hindert, aber auf diese Weise liegt später eine mögliche Verwirrung.

Ob diese Technik akzeptabel ist oder nicht, ist eine interessante Frage für sich. Es kann zu Problemen beim Laden von Klassen kommen, besonders wenn Sie in einem Container arbeiten, der Spiele mit Classloading spielt.

+0

Das war die erste Idee, die ich hatte, aber es ist nicht so einfach, weil es einen illegalen Zugriffsfehler zeigt, auf dem HTMLReader gibt es Aufrufe an javax.swing.text.html.Map-Klasse und seine nicht öffentlich ... und viele andere kleinere Probleme, wie nicht in der Lage, einige super Methoden zu nennen, also, um dieses Problem zu lösen, habe ich mein eigenes Paket javax.swing.text.html erstellt und meine Klasse hinzugefügt, die HTMLDocument erweitert und erstellte einen neuen HTMLReader innerClass, der Reflektion verwendet, um die privaten oder Standardmethoden zu erhalten ... vielleicht ist es nicht der beste Weg ... aber es funktioniert .. – ThanatosMK

0

Grundsätzlich gilt: Wie ich bereits kommentiert, gibt es eine Möglichkeit, es zu tun ... ist kein einfacher Weg, aber es könnte hilfreich sein:

Erstellen Sie ein Paket in der Lösung mit dem gleichen Namen, dass die verwendete Klasse (zB Htmldocument), in diesem Fall: „javax.swing.text.html“

erstellen Sie eine Klasse, die die ursprüngliche Klasse (CorrectHTMLDocument)

Es gibt viele bedeutende Dinge erweitert: Alle privated Mitglieder wird eine IllegallAccessException auslösen, also habe ich Reflektion über HTMLDocument.class verwendet, um alle von ihnen zu erhalten und zugänglich zu machen.

Um „Aufschalten“ das falsche HTMLReader, ich kopieren/den ursprünglichen Quellcode einfügen, der es und es als Innerclass in CorrectHTMLDocument setzen, und die gleiche Technik beschrieben sind, lösen die IllegalAccessExceptions

Es gibt ein paar Dinge , gibt es einige Aufrufe von "Standard" Zugriff Klassen wie javax.swing.text.html.Map, um den IllegalAccessError zu lösen, wieder habe ich Reflexion über Klasse verwendet und die ursprünglichen Map Deklaration Mitglieder für Object geändert.

Jetzt ist es funktioniert gut ... Ich hoffe, dass es mit dem gleichen Problem zu einem hilft ... wenn es etwas gibt ...

Verwandte Themen