execution fails with IncompatibleClassChangeError
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue Dec 18 09:32:59 PST 2012
On 18/12/12 16:54, Remi Forax wrote:
> On 12/18/2012 05:14 PM, Maurizio Cimadamore wrote:
>> On 18/12/12 15:51, Brian Goetz wrote:
>>> Yes, this is a known bug with constructor refs to private nested
>>> classes. We are currently trying to figure out whether the solution
>>> needs to come from the compiler or the VM. (In the meantime, you can
>>> make the Bar constructor but not class public, which should get you past
>>> your current problem without opening additional security holes.)
>> I think that, since this is a bug, there's no rush to get a fix in while
>> we are figuring out what's the better way to fix it. If the outcome of
>> the discussion is that we'll have to change the compiler, we'll do that
>> when the time comes. It doesn't seem a super common issue anyway.
> The root cause of this bug is the infamous 4071957
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4071957
> and to make a long story short, the EG of JSR 292 has decided to align
> the semantics of method handles on the reflection API on that subject.
For the records: a cheap way to fix this in the compiler would be to
expand the bridging strategy we are currently using in some cases (i.e.
super method reference calls) to cover these cases as well.
Maurizio
>
>> Maurizio
> Rémi
>
>>> On 12/18/2012 6:38 AM, Anna Kozlova wrote:
>>>> Hello,
>>>>
>>>>
>>>>
>>>> Running the following class
>>>>
>>>> {code}
>>>>
>>>> public class FooBar {
>>>>
>>>> private static final class Bar {
>>>>
>>>> private Bar() {
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> private interface I {
>>>>
>>>> Bar create();
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> static void foo(I intf) {}
>>>>
>>>>
>>>>
>>>> public static void main(String[] args) throws Exception {
>>>>
>>>> foo(Bar::new);
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>> {code}
>>>>
>>>>
>>>>
>>>> fails with
>>>>
>>>> Exception in thread "main" java.lang.IncompatibleClassChangeError
>>>>
>>>> at
>>>> java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNa
>>>> tives.java:383)
>>>>
>>>> at p.FooBar.main(FooBar.java:18)
>>>>
>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
>>>> Method)
>>>>
>>>> at
>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57
>>>> )
>>>>
>>>> at
>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
>>>> .java:43)
>>>>
>>>> at java.lang.reflect.Method.invoke(Method.java:474)
>>>>
>>>> at
>>>> com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
>>>>
>>>> Caused by: java.lang.IllegalAccessException: member is private:
>>>> p.FooBar$Bar.<init>()void/invokeSpecial, from p.FooBar
>>>>
>>>> at
>>>> java.lang.invoke.MemberName.makeAccessException(MemberName.java:732)
>>>>
>>>> at
>>>> java.lang.invoke.MethodHandles$Lookup.checkAccess(MethodHandles.java:1135)
>>>>
>>>> at
>>>> java.lang.invoke.MethodHandles$Lookup.getDirectConstructor(MethodHandles.jav
>>>> a:1243)
>>>>
>>>> at
>>>> java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles
>>>> .java:1270)
>>>>
>>>> at
>>>> java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNa
>>>> tives.java:381)
>>>>
>>>> ... 6 more
>>>>
>>>>
>>>>
>>>> If I convert method reference to lambda expression or anonymous class
>>>> everything works correctly. Checked with b68.
>>>>
>>>>
>>>>
>>>> Thank you
>>>> Anna
>>>>
>>>>
>>>>
>>>>
>
More information about the lambda-dev
mailing list