[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. .. .. ~~
Die Oracle JDK Bug Database hatte das gleiche Problem. https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8143647
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. .. ..
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