Following code causes IncompatibleClassChangeError to be thrown:
interface MyFunctionalInterface {
void invokeMethodReference(int a);
}
public class Test {
private void m(int a) {
System.out.println(a);
}
void test() {
class Inner {
MyFunctionalInterface createMethodReference() {
m(12);
return Test.this::m;
}
}
MyFunctionalInterface fi = new Inner().createMethodReference();
fi.invokeMethodReference(1);
}
public static void main(String argv[]) {
new Test().test();
}
}
The output is:
12
Exception in thread "main" java.lang.IncompatibleClassChangeError
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:384)
at Test$1Inner.createMethodReference(Test.java:13)
at Test.test(Test.java:16)
at Test.main(Test.java:21)
Caused by: java.lang.IllegalAccessException: member is private: Test.m(int)void/invokeSpecial, from Test$1Inner
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:742)
at java.lang.invoke.MethodHandles$Lookup.checkAccess(MethodHandles.java:1173)
at java.lang.invoke.MethodHandles$Lookup.checkMethod(MethodHandles.java:1136)
at java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(MethodHandles.java:1247)
at java.lang.invoke.MethodHandles$Lookup.getDirectMethod(MethodHandles.java:1237)
at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1329)
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:382)
... 3 more
Method m is successfully invoked while creating method reference to it fails.
This has occurred on lambda b100(x64), Windows7x64.
interface MyFunctionalInterface {
void invokeMethodReference(int a);
}
public class Test {
private void m(int a) {
System.out.println(a);
}
void test() {
class Inner {
MyFunctionalInterface createMethodReference() {
m(12);
return Test.this::m;
}
}
MyFunctionalInterface fi = new Inner().createMethodReference();
fi.invokeMethodReference(1);
}
public static void main(String argv[]) {
new Test().test();
}
}
The output is:
12
Exception in thread "main" java.lang.IncompatibleClassChangeError
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:384)
at Test$1Inner.createMethodReference(Test.java:13)
at Test.test(Test.java:16)
at Test.main(Test.java:21)
Caused by: java.lang.IllegalAccessException: member is private: Test.m(int)void/invokeSpecial, from Test$1Inner
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:742)
at java.lang.invoke.MethodHandles$Lookup.checkAccess(MethodHandles.java:1173)
at java.lang.invoke.MethodHandles$Lookup.checkMethod(MethodHandles.java:1136)
at java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(MethodHandles.java:1247)
at java.lang.invoke.MethodHandles$Lookup.getDirectMethod(MethodHandles.java:1237)
at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1329)
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:382)
... 3 more
Method m is successfully invoked while creating method reference to it fails.
This has occurred on lambda b100(x64), Windows7x64.
- is blocked by
-
JDK-8022720 private method should be accessible (nested classes)
-
- Closed
-
-
JDK-8010319 Implementation of JEP 181: Nest-Based Access Control
-
- Resolved
-
- relates to
-
JDK-8010319 Implementation of JEP 181: Nest-Based Access Control
-
- Resolved
-