Как определить, что у метода есть аргумент varargs, используя отражение?

Вот пример кода

package org.example;

import java.lang.reflect.Method;

class TestRef {

        public void testA(String ... a) {
                for (String i : a) {
                        System.out.println(i);
                }
        }

        public static void main(String[] args){

                Class testRefClass = TestRef.class;

                for (Method m: testRefClass.getMethods()) {
                        if (m.getName() == "testA") {
                                System.out.println(m);
                        }
                }
        }
}

Выход

public void org.example.TestRef.testA(java.lang.String[])

Таким образом, сообщается, что сигнатура метода принимает массив String.

Есть ли какое-либо средство в библиотеке отражения, которое я могу сказать, что метод изначально объявлен как принимающий varargs?


person Anthony Kong    schedule 15.06.2010    source источник


Ответы (2)


Есть ли какое-либо средство в библиотеке отражения, которое я могу сказать, что метод изначально объявлен для использования varargs?

Ага. java.lang.reflect.Method.isVarArgs().

Однако это полезно только в том случае, если вы пытаетесь собрать и отобразить сигнатуры методов в удобочитаемой форме. Если вам нужно вызвать метод varargs с помощью отражения, вам придется собрать аргументы varargs в аргумент типа массива.

person Stephen C    schedule 15.06.2010
comment
Следует также отметить, что в method.getModifiers() будет установлен бит Modifier.TRANSIENT для метода varargs. - person ILMTitan; 15.06.2010
comment
@ILMTitan - не понимаю, почему это стоит отметить. Модификатор transient не имеет смысла для метода. Этот бит установлен только потому, что соответствующий бит флага classfile используется для разных вещей в разных контекстах; т. е. биты TRANSIENT и VARARGS — это один и тот же бит. - person Stephen C; 26.11.2012

на самом деле нет никакой разницы

static public void main(String[]  args)
static public void main(String... args)

на самом деле нотация ... была введена очень поздно в процессе добавления vararg в java. Джеймс Гослинг предложил это, он думает, что это симпатичнее. До этого тот же [] обозначает варарг.

person irreputable    schedule 15.06.2010
comment
У вас есть источник для этого? Кажется, что разница гораздо более глубокая, чем эстетическая. - person Yishai; 15.06.2010