JAVADOC clarification needed in Class.getMethod
Jochen Theodorou
blackdrag at gmx.org
Sat Aug 29 14:53:14 UTC 2015
yeah, you are right, I made a mistake. supplying a null argument t a
method call to call a Class varargs taking method is ambiguous. The
compiler will want you to cast to either Class, in which case the null
would be wrapped, or to Class[], in which case there will be no
wrapping. Example:
public class Foo {
static void test(Class... params) { System.out.println(params==null);}
public static void main(String[] args) {test((Class[])null);}
}
javap -c will show for the main method:
> public static void main(java.lang.String[]);
> Code:
> 0: aconst_null
> 1: checkcast #4 // class "[Ljava/lang/Class;"
> 4: invokestatic #5 // Method test:([Ljava/lang/Class;)V
> 7: return
which means no wrapping in an array. But you can bypass the cast through
a different method as well:
public class Foo {
static void test(Class... params) { System.out.println(params==null);}
static void bar(Class[] params) {test(params);}
public static void main(String[] args){bar(null);}
}
since bar already supplies a Class[], it will be directly taken.
But maybe I did misunderstand the intention of your post. In that cae,
sorry for the noise
Am 29.08.2015 15:40, schrieb Kyung Koo Yoon:
> Hi, Jochen.
>
> --
> --------------------
> Software Innovation Driver yoonforh at gmail dot com
> Analyze, Reason, Reshape the Question
> PGP http://www.javadom.com/personal/yoonforhatgmaildotcom.asc
>
>> 2015. 8. 29., 오후 10:01, Jochen Theodorou <blackdrag at gmx.org
>> <mailto:blackdrag at gmx.org>> 작성:
>>
>> Am 29.08.2015 10:56, schrieb Kyung Koo Yoon:
>>> Hi, all.
>>>
>>> The javadoc comment of java.lang.Class.getMethod API has following
>>> clause.
>>>
>>> @CallerSensitive
>>> public Method getMethod(String name, Class<?>... parameterTypes)
>>> throws NoSuchMethodException, SecurityException
>>>
>>>
>>> "The {@code parameterTypes} parameter is an array of {@code Class}
>>> objects that identify the method's formal parameter types, in declared
>>> order. If {@code parameterTypes} is {@code null}, it is
>>> treated as if it were an empty array."
>>>
>>> As you know the method signature changed to use varargs since JDK 1.5,
>>> if parameterTypes is given null, the compiler will interpret the
>>> parameter with “new Class[] { null }”.
>>
>> you are making a wrong assumption here. If null is given there will be
>> no wrapping in an array. varargs are defined that there is no wrapping
>> if the given argument type is compatible. For Class[] this is Class[]
>> and of course null. Even if you had been right, you could still give
>> produce a call with null by reflection or using the MethodHandles API
>
> You can check by simply decompiling the generated byte codes.
> vararg is not a JVM feature so the compiler pre-processes and the
> compiler handles the given null as array’s first element.
>
> Originally class.getMethod(“methodName”, null) should have meant a
> static method, but with vararg, it’s not.
>
>>
>> bye blackdrag
>>
>> --
>> Jochen "blackdrag" Theodorou
>> blog:http://blackdragsview.blogspot.com/
>
--
Jochen "blackdrag" Theodorou
blog: http://blackdragsview.blogspot.com/
More information about the core-libs-dev
mailing list