Java17 und Regex

Christopher25

Bekanntes Mitglied
Hallo Zusammen,

ich habe ein kleines/großes Problemchen nach dem Umstellen auf Java17.
Und zwar hat Java leider eine Restriktion eingebaut per Reflection auf bestimmte interne Funktionen zu gestatten.

Ich brauche jedoch aus der Pattern-Klasse die "NamedGroups" HashMap welche mir ja den Gruppennamen und die GroupId liefern soll.
Ich kann leider nicht mehr die methode oder variable mit accessible(true) abfragen.

Ich habe mir daraufhin eine Hilfsfunktion geschrieben welche leider ein wenig komplex ist und zudem Matcher erfordert, was vorher nicht notwendig war.
Das ist aber garnicht das Problem, denn das Problem an meiner neuen Methode ist, dass es nur die Groups zurückliefert in einer HashMap, welche auch tatsächlich in dem gesuchten Text vorkommt.
Ich brauche aber für meinen weiteren Prozess (SyntaxHighlighting) die volle Liste mit allen Gruppen, da meine Logik die halt mit Java8/11 funktioniert hatte alle Gruppen erwartet und es verdammt aufwendig wäre diese Logik umzuschreiben bzw. mir eine neue auszudenken.

Die Hilfsmethode sieht im übrigen folgendermaßen aus für diejenigen die es interessiert:
Java:
public static Map<String, Integer> getNamedGroups(Pattern regex, String text) throws SecurityException, IllegalArgumentException {
        Map<String, Integer> mapOfNamedGroups = new HashMap<>();

        Matcher matcherGroups = Pattern.compile("\\(\\?<([a-zA-Z][a-zA-Z0-9]*)>").matcher(regex.pattern());
        while (matcherGroups.find()) {
            Matcher matcherRegex = regex.matcher(text);
            secondWhile: while (matcherRegex.find()) {
                for (int groupId = 1; groupId < matcherRegex.groupCount(); groupId++) {
                    if (matcherRegex.group(groupId) != null && matcherRegex.group(matcherGroups.group(1)) != null) {
                        mapOfNamedGroups.put(matcherGroups.group(1), groupId);
                        break secondWhile;
                    }
                }
            }
        }

        return mapOfNamedGroups;
    }

Falls ihr einen Tipp habt was ich vielleicht noch machen kann wäre es echt cool wenn ihr mich darauf hinweisen könnt 😉

Thx
 
Ok ich bin soweit erstmal auf Java11 runter gegangen und werden mir irgendwann etwas für dieses Problem einfallen lassen.
Jedoch habe ich noch ein anderes Thema was selbst bei Java11 noch zum tragen kommt.

Und zwar wurden ja die "sun" libs etc. entfernt/unbenannt etc. oder unzugänglich gemacht.
So leider auch die Klasse "ContextMenuContent".
Diese brauch ich jedoch um das Default ContextMenu von dem Javafx HtmlEditor zu erweitern mit neuen MenuItems.
Wenn ich ja ein eigenes ContextMenu setze dann wird ja leider der default überschrieben.

Weiß vielleicht jemand eine effektive Möglichkeit dem HtmlEditor's default-ContextMenu beizubehalten aber neue Items hinzuzufügen?
Ich habe schon ausprobiert das ganze per listener "setOnContextMenuRequested" probiert. Leider scheint dies aber zu früh zu sein, als dass das ContextMenu schon existieren würde.
 
warum denn nicht ?

was willst ud überhaupt machen

und nein ich hab keine ahnung was der regex ausdruck machen sollte oder die methode bewirken sollte
Warum denn nicht?
Weil ab java17 reflection verändert wurde wenn es darum geht auf interne functionen von java zuzugreifen.
Soweit ich weiß ist das wegen dem hier https://openjdk.java.net/jeps/403

Was ich will? nun ich brauche die Map die mir die Group-namen + group-ids in eine map packt. Und zwar brauch ich ALLE.
Der weitere Prozess geht dann hin und benutzt diese für SyntaxHighlighting,
damit ich weiß welche Farben ich von wo bis wo setzen muss wenn gruppe-xy gematched wird.
Aber viel wichtiger ist erstmal die zweite Frage, da ich jetzt erstmal entschieden habe auf java11 zu wechseln anstatt direkt von java8 auf java17.
 
Moin, füg mal bitte folgende Compiler-Option sowohl beim Compilieren als auch beim Ausführung hinzu: --add-exports java.base/jdk.internal.misc=ALL-UNNAMED

...dann sollte deine Reflection mit Java 17 funktionieren.
 
Moin, füg mal bitte folgende Compiler-Option sowohl beim Compilieren als auch beim Ausführung hinzu: --add-exports java.base/jdk.internal.misc=ALL-UNNAMED

...dann sollte deine Reflection mit Java 17 funktionieren.
Leider nach wie vor
java.lang.reflect.InaccessibleObjectException: Unable to make java.util.Map java.util.regex.Pattern.namedGroups() accessible: module java.base does not "opens java.util.regex"
 
Da wirst Du vermutlich nicht herumkommen, Dir einen kleinen Parser zu schreiben. Der sollte aber nicht so dramatisch sein.
 
Jetzt kenn ich mich mit IJ nicht so gut aus, aber die Parameter müssen sowohl javac wie auch java übergeben werden (also sowohl beim Übersetzen als auch beim Starten). Anstatt --add-exports kannst du auch --add-opens schreiben, die sollten äquivalent sein.

Wenn es nicht funktioniert, musst du mal anhand der Fehlermeldung ausprobieren, welche Kombination du brauchst... Ich weiß, das klingt ein bisschen, wie Stochern im Nebel, aber is leider so^^

Wenn es auch dann nicht funktioniert... Bleibt dir nur das Verwenden einer älteren Version oder das von @mihe7 erwähnte Umschreiben...
 
Jetzt kenn ich mich mit IJ nicht so gut aus, aber die Parameter müssen sowohl javac wie auch java übergeben werden (also sowohl beim Übersetzen als auch beim Starten). Anstatt --add-exports kannst du auch --add-opens schreiben, die sollten äquivalent sein.

Wenn es nicht funktioniert, musst du mal anhand der Fehlermeldung ausprobieren, welche Kombination du brauchst... Ich weiß, das klingt ein bisschen, wie Stochern im Nebel, aber is leider so^^

Wenn es auch dann nicht funktioniert... Bleibt dir nur das Verwenden einer älteren Version oder das von @mihe7 erwähnte Umschreiben...
So. Funktioniert jetzt. Ich habe wie du sagtest bisschen rumprobiert.
Mir sind zwei Sachen aufgefallen....

1. --add-exports und --add-opens ist nicht das gleiche. Ich brauche --add-opens
2. in der Fehlermeldung sagte der mir ja dass er das Modul "java.util.regex" nicht öffnen kann. Es muss also GENAU das sein
und es reicht nicht das allgemein mit nur "java.util" anzugeben ein "java.util.*" oder so funktioniert ebenso wenig.

Das Ergebnis sieht dann wie folgt aus:
--add-opens java.base/java.util.regex=ALL-UNNAMED

Vielen Dank für Eure Hilfe.
Ich habe jedoch noch die Frage zum Post #2
Soll ich dafür einen neuen Thread aufmachen?
 

Zurück
Oben