Last active
November 16, 2019 22:11
-
-
Save AppLoidx/a69d481ee97681059155025e803358d8 to your computer and use it in GitHub Desktop.
java.lang.IllegalAccessError in runtime
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package tasks; | |
/** | |
* @author Arthur Kupriyanov | |
*/ | |
class C { | |
private boolean getBoolean() { | |
return false; | |
} | |
// but it works when we declare getBoolean method as public | |
} | |
interface I { | |
default boolean getBoolean() { | |
return true; | |
} | |
} | |
class D extends C implements I {} | |
public class IllegalAccessError { | |
public static void main(String[] a) { | |
foo(new D()); // java.lang.IllegalAccessError in Runtime | |
} | |
public static void foo(I i) { | |
System.out.println(i.getBoolean()); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Такое поведение JVM объясняется тем, как происходит поиск целевого метода для инструкции
invokeinterface
. Согласно спецификации, в первую очередь просматриваются instance-методы класса и всех супер-классов, и только затем ищется подходящийdefault
метод среди супер-интерфейсов, при этом приватность найденного метода проверяется только после завершения всего процесса.Поэтому, если вы измените метод getBoolean в классе C на
public
, то получитеfalse
. А при приватном, у вас выброситсяIllegalAccessError