MethodHandle.invoke* should only work with source 1.7
maurizio cimadamore
maurizio.cimadamore at oracle.com
Thu Feb 10 16:01:24 PST 2011
On 10/02/2011 23:03, John Rose wrote:
> On Feb 10, 2011, at 3:46 AM, Rémi Forax wrote:
>
>> The main problem is that when you will run it, with a 1.7 VM because
>> MethodHandle is only available with a 1.7 VM,
>> the VM will throw a WrongMethodTypeException because as you said the 292
>> magic will be ignored.
>>
>> I think it's better for the users to don't compile instead of compiling
>> something which is inherently wrong.
> Try compiling mh.invokeExact using a 1.6 compiler against a 1.7 rt.jar. You should get a compile-time error, since the class file version numbers are wrong. The 1.6 compiler should refuse to load MethodHandle.class from rt.jar.
>
> If you compile against a non-standard rt.jar, you might get the error you are observing, but that error won't affect 1.7 users. If it affects backport users, I suggest taking steps to put the java.dyn package jar in a special place where the 1.6 compiler is not going to see it, by default.
>
> There are lots of variations on this theme of version mismatches. But the class file version number saves us in a lot of them.
Note also that if you use the JDK 7 compiler with -source 6 flag to
compile a class that contains MethodHandle, a warning will be emitted
(not related to MethodHandle though):
warning: [options] bootstrap class path not set in conjunction with
-source 1.6
1 warning
IMHO the above warning should be enough to justify the runtime
failure... if you follow the warning suggestion and fix bootclasspath
(to point to JDK 6's rt.jar) then the program won't compile anymore (as
java.dyn is not available in JDK 6).
Maurizio
> -- John
More information about the mlvm-dev
mailing list