[Java] Einen Fehler im JDK-Compiler beheben

Wahrscheinlich derjenige, der darauf trat

[JDK-8143647] Javac compiles method reference that allows results in an IllegalAccessError

~~ * Wie später beschrieben wird, ist dies ein Ereignis, das in ** Oracle JDK ** anstelle von OpenJDK aufgetreten ist. Es ist also ehrlich gesagt subtil, ob es sich um denselben Fehler handelt. .. .. ~~

Nachtrag

Die Oracle JDK Bug Database hatte das gleiche Problem. https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8143647

Was ist passiert

Mit ** Oracle JDK 8u92 ** unter Solaris kompilierte Klassen stürzen zur Laufzeit mit IllegalAccessError ab.

Eine mit Eclipse Mars 2 (4.5.2) unter Windows 7 (x64) kompilierte Klasse funktioniert problemlos mit derselben Quelle. .. ..

Wenn Sie den Bytecode mit javap -c untersuchen, ist der Ort, an dem ** Methodenreferenz ** verwendet wird, nicht die konkrete Klasse im Quellcode, sondern die übergeordnete Klasse, die unsichtbare ( package private) Abstraktion. Es wurde durch eine Klasse ersetzt.

Das Verfahren zum Reproduzieren des obigen Problems ist wie folgt.

1) Create default-scoped abstract class with concrete method
2) Create a concrete public class extending the above class in the same package
3) Use a method reference to this inherited method in a class outside of the package 

Andererseits ist die Quelle, die die problematische Klasse vereinfacht, und die Klasse, auf die sich die Methode bezieht, die

simplification


package inner;
abstract class AbstractHoge {
    public String getSomething() {
        ...
    }
}

package inner;
public class Hoge extends AbstractHoge {
}

package outer;
import inner.Hoge;
...
public class Fuga {
    public void doSomething(List<Hoge> list) {
        Map<String, List<Hoge>> map = 
            list.stream().collect(Collectors.groupingBy(Hoge::getSomething));
        ...
    }
}

Mit einem solchen Gefühl wurden die Aktivierungsbedingungen hervorragend erfüllt. .. ..

Lösung

In der obigen Ausgabe wurde es anscheinend um "8u102" oder "8u111" zurückportiert. Aktualisieren Sie daher auf eine neuere Version von Oracle JDK. ⇒ Tatsächlich wurde das Problem in der mit ** Oracle JDK 8u161 ** kompilierten Klasse gelöst.

Recommended Posts

[Java] Einen Fehler im JDK-Compiler beheben
Java Open JDK 8 unter CentOS 7 installieren
Erstellen Sie eine Java-Entwicklungsumgebung auf dem Mac
Java-Kern: HotSpot-Compiler stürzt unter SIGSEGV ab
JDK8 ist ein schweres Problem unter MacOS
Stellen Sie eine Java-Web-App für Heroku bereit
Java Installation jdk
Eine Geschichte über das JDK in der Java 11-Ära
Erstellen Sie eine Java-Ausführungsumgebung auf Sakura VPS
Ich habe versucht, Java in einem Mac-Terminal auszuführen
Erstellen Sie eine Java-Entwicklungsumgebung mit jenv auf Ihrem Mac
Ich habe versucht, Log4j2 auf einem Java EE-Server zu verwenden
[Java] Wie man Aufgaben regelmäßig ausführt
Einrichtungsverfahren für das Java SE Development Kit (JDK) unter Windows
Erstellen einer kompakten Java-Umgebung, die unter Docker ausgeführt wird
Fragen und Antworten zu JDK
Installieren Sie Java auf dem Mac
[Java] Erstellen Sie einen Filter
Führen Sie PostgreSQL unter Java aus
Java baut ein Dreieck
Brainfuck-> Java Byte Code Compiler
Führen Sie R von einem Tomcat-basierten Java-Prozess unter Amazon Linux aus
So stellen Sie eine Kotlin (Java) -App auf AWS fargate bereit
Java-Sprachfunktion und wie sie einen subtilen Fehler verursachte
Versuchen Sie Hello World mit einfachem Java im Docker-Container