2010-06-15 9 views
6

Aquí hay un código de ejemplo¿Cómo decir que un método tiene un argumento varargs usando reflection?

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); 
         } 
       } 
     } 
} 

La salida es

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

Así la firma del método se informó a tomar una serie de cuerdas.

¿Hay algún medio en la biblioteca de reflexión que pueda decir que el método es originalmente declarado tomar una varargs?

Respuesta

18

¿Hay algún medio en la biblioteca de reflexión que pueda decir que el método está originalmente declarado para tomar una varargs?

Yup. java.lang.reflect.Method.isVarArgs().

Sin embargo, esto solo es útil si está tratando de ensamblar y mostrar las firmas de métodos en forma legible por humanos. Si necesita invocar un método varargs utilizando la reflexión, deberá ensamblar los argumentos varargs en un argumento de tipo matriz.

+2

También se debe tener en cuenta que method.getModifiers() tendrá el bit Modifier.TRANSIENT establecido para un método varargs. – ILMTitan

+1

@ILMTitan - No veo por qué vale la pena señalarlo. El modificador 'transitorio' no es significativo para un método. El bit solo se establece porque el bit de indicador del archivo de clase correspondiente se usa para diferentes cosas en diferentes contextos; es decir, los bits TRANSITORIO y VARÁRGICO son el mismo bit. –

1

en realidad no hay diferencia

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

la realidad ... notación fue introducido muy tarde en el proceso de añadir vararg en Java. James Gosling lo propuso, él piensa que es más lindo. Antes de eso, el mismo [] denota el vararg.

+4

¿Tiene una fuente para eso? Parece que la diferencia es mucho más profunda que la estética. – Yishai

Cuestiones relacionadas