2010-06-15 5 views
6

Voici un exemple de codeComment dire une méthode a un argument varargs en utilisant la réflexion?

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 sortie est

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

Ainsi, la signature de la méthode est signalé à prendre un ensemble de cordes.

Y at-il une moyenne dans la bibliothèque de réflexion, je peux dire que la méthode est à l'origine déclaré pour prendre un varargs?

Répondre

18

Y at-il une moyenne dans la bibliothèque de réflexion que je peux dire que la méthode est à l'origine déclarée pour prendre un varargs?

Yup. java.lang.reflect.Method.isVarArgs(). Cependant, ceci n'est utile que si vous essayez d'assembler et d'afficher des signatures de méthode sous une forme lisible par un humain. Si vous avez besoin d'invoquer une méthode varargs en utilisant la réflexion, vous devrez assembler les arguments varargs dans un argument de type tableau.

+2

Il convient également de noter que method.getModifiers() aura le bit Modifier.TRANSIENT défini pour une méthode varargs. – ILMTitan

+1

@ILMTitan - Je ne vois pas pourquoi cela vaut la peine d'être noté. Le modificateur 'transient' n'est pas significatif pour une méthode. Le bit n'est défini que parce que le bit correspondant du classfile est utilisé pour différentes choses dans des contextes différents; c'est-à-dire que les bits TRANSIENT et VARARGS sont du même bit. –

1

il n'y a vraiment pas de différence

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

en fait la ... la notation a été introduit très tard dans le processus d'ajout vararg en java. James Gosling l'a proposé, il pense que c'est plus mignon. Avant cela, le même [] désigne le vararg.

+4

Avez-vous une source pour cela? Il semble que la différence soit beaucoup plus profonde que l'esthétique. – Yishai

Questions connexes