2008-10-22 6 views
2

Je sais comment trouver une méthode en Java en utilisant une chaîne fixe,Puis-je utiliser des expressions régulières pour trouver une méthode sur une classe dans java?

someClass.getMethod("foobar", argTypes); 

, mais est-il un moyen d'utiliser une expression régulière plutôt qu'une chaîne fixe pour trouver une méthode sur une classe donnée? Un exemple de l'utilisation pourrait être si je voulais trouver une méthode qui a été appelée «foobar» ou «fooBar». L'utilisation d'une expression régulière comme "foo [Bb] ar" correspond à l'un ou l'autre de ces noms de méthode.

Répondre

5

Vous devez appliquer votre expression rationnelle sur la méthode de réflexion getDeclaredMethods() (ou GetMethods() si vous voulez uniquement les publics).

[Attention:. Les deux méthodes jetteront un SecurityException s'il y a un gestionnaire de sécurité]

Vous appliquez sur chaque nom de chaque méthode retournée par getDeclaredMethod() et seulement mémoriser dans une collection les méthodes conformes.

Quelque chose comme!

try 
{ 
    final Pattern aMethodNamePattern = Pattern.compile("foo[Bb]ar"); 
    final List<Method> someMethods = aClass.getDeclaredMethods(); 
    final List<Method> someCompliantMethods = new ArrayList<Method>(); 
    for(final Method aMethod: someMethods) 
    { 
    final String aMethodName = aMethod.getName(); 
    final Matcher aMethodNameMatcher = aMethodNamePattern.getMatcher(aMethodName); 
    if(aMethodNameMatcher.matches() == true) 
    { 
     someCompliantMethods.add(aMethod); 
    } 
} 
catch(...) // catch all exceptions like SecurityException, IllegalAccessException, ... 
+0

'getDeclaredMethods' peut échouer si un gestionnaire de sécurité est installé. 'getMethods' correspond à la question. –

+0

Je ne suis pas sûr de vous suivre: 1/les deux méthodes peuvent déclencher une SecurityException. 2/Comment getMethods correspond mieux aux questions? Il n'y a pas de référence aux méthodes «publiques» seulement ... Ce que je fais est votre compteur de votes négatifs: 361 votes négatifs! vraiment ? Impressionnant ;) – VonC

1

Pas directement. Vous pouvez boucler toutes les méthodes et vérifier chacune.

Pattern p = Pattern.compile("foo[Bb]ar"); 
for(Method m : someClass.getMethods()) { 
    if(p.matcher(m.getName()).matches()) { 
    return m; 
    } 
} 
0

Non, vous ne pouvez pas le faire, mais vous pouvez obtenir une liste de la méthode a une classe et d'appliquer le regexp pour eux.

Method[] getMethods(String regexp, Class clazz, Object ... argTypes){ 
    List<Method> toReturn = new ArrayList<Method>(); 
    for(Method m : clazz.getDeclaredMethods()){ 
     if(m.getName().matches(regExp)) { // validate argTypes aswell here... 
      toReturn.add(m); 
     } 
    } 
    return toReturn.toArray(); 
} 

Eh bien quelque chose comme ça ....

1

Vous pouvez le faire par itérer sur toutes les méthodes d'une classe et les jumelant de cette façon.

pas aussi simple que cela, mais il ferait l'affaire

ArrayList<Method> matches = new ArrayList<Method>(); 
    for(Method meth : String.class.getMethods()) { 
     if (meth.getName().matches("lengt.")){ 
      matches.add(meth); 
     } 
    } 
0

Quand je veux trouver une méthode utilisant un modèle de nom simple que j'utilise cette org.reflections

Par exemple la recherche de certaines méthodes qui sont publiques et nom début avec get:

Set<Method> getters = ReflectionUtils.getAllMethods(SomeClass.class, ReflectionUtils.withModifier(Modifier.PUBLIC), ReflectionUtils.withPrefix("get"));