Suppressed IllegalAccessException in MethodHandle.setVarargs

Mandy Chung mandy.chung at oracle.com
Thu May 20 18:43:26 UTC 2021


This seems a good improvement.  I created 
https://bugs.openjdk.java.net/browse/JDK-8267509 for this issue.

How did you run into this illegal varargs method?  Is that class file 
generated at runtime?

Mandy

On 5/20/21 10:18 AM, x4e_x4e wrote:
> Hello,
>
> If a MethodHandles.Lookup is used to locate a MethodHandle for a varargs method who's final parameter is not an array an IllegalArgumentException will be thrown:
>
>> java.lang.IllegalArgumentException: not an array type: int
>>       at java.base/java.lang.invoke.MethodHandleStatics.newIllegalArgumentException(MethodHandleStatics.java:138)
>>       at java.base/java.lang.invoke.MethodHandle.spreadArrayChecks(MethodHandle.java:1066)
>>       at java.base/java.lang.invoke.MethodHandle.asCollectorChecks(MethodHandle.java:1259)
>>       at java.base/java.lang.invoke.MethodHandle.asVarargsCollector(MethodHandle.java:1427)
>>       at java.base/java.lang.invoke.MethodHandle.withVarargs(MethodHandle.java:1111)
>>       at java.base/java.lang.invoke.MethodHandle.setVarargs(MethodHandle.java:1634)
>>       at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(MethodHandles.java:3755)
>>       at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethod(MethodHandles.java:3691)
>>       at java.base/java.lang.invoke.MethodHandles$Lookup.findStatic(MethodHandles.java:2399)
> This makes sense, however it seems that the exception is swallowed and instead a generic IllegalAccessException is thrown:
>
>> Caused by: java.lang.IllegalAccessException: cannot make variable arity: package.Class.method(Object[],int)Object/invokeStatic
>>      at java.base/java.lang.invoke.MemberName.makeAccessException(MemberName.java:957)
>>      at java.base/java.lang.invoke.MethodHandle.setVarargs(MethodHandle.java:1636)
>>      at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(MethodHandles.java:3755)
>>      at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethod(MethodHandles.java:3691)
>>      at java.base/java.lang.invoke.MethodHandles$Lookup.findStatic(MethodHandles.java:2399)
> It would probably be helpful to make the IllegalAccessException caused by the IllegalArgumentException, or at the very least add it as a suppressed exception.
> Otherwise the only way to find the helpful exception here is through runtime debugging.
>
> Relevant code: https://github.com/openjdk/jdk/blob/7b98400c81900a8c779394d549b5fb61f1dd8638/src/java.base/share/classes/java/lang/invoke/MethodHandle.java#L1635
>
> Thanks,
> x4e



More information about the core-libs-dev mailing list