Могу ли я использовать регулярные выражения, чтобы найти метод в классе в Java? - PullRequest
2 голосов
/ 22 октября 2008

Я знаю, как найти метод в Java, используя фиксированную строку,

someClass.getMethod("foobar", argTypes);

но есть ли способ использовать регулярное выражение вместо фиксированной строки для поиска метода в данном классе?

Примером использования может быть, если я хочу найти метод, который был назван либо «foobar», либо «fooBar». Использование регулярного выражения типа "foo [Bb] ar" будет соответствовать любому из этих имен методов.

Ответы [ 5 ]

5 голосов
/ 22 октября 2008

Вы должны применить свое регулярное выражение к getDeclaredMethods () методу отражения (или GetMethods (), если вам нужны только открытые).

[Предупреждение: оба метода вызовут исключение SecurityException, если есть менеджер безопасности.]

Вы применяете его к каждому имени каждого метода, возвращаемого getDeclaredMethod (), и запоминаете только в коллекции соответствующие методы.

Нечто подобное!

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, ...
1 голос
/ 23 октября 2008

Вы можете сделать это, перебирая ВСЕ методы в классе и сопоставляя их таким образом.

Не все так просто, но сработало бы

    ArrayList<Method> matches = new ArrayList<Method>();
    for(Method meth : String.class.getMethods()) {
        if (meth.getName().matches("lengt.")){
            matches.add(meth);
        }
    }
1 голос
/ 23 октября 2008

Не напрямую. Вы можете перебрать все методы и проверить каждый.

Pattern p = Pattern.compile("foo[Bb]ar");
for(Method m : someClass.getMethods()) {
  if(p.matcher(m.getName()).matches()) {
    return m; 
  }
}
0 голосов
/ 16 февраля 2016

Когда я хочу найти какой-нибудь метод, использующий простой шаблон имени, я использую это org.reflections

Например, ищем некоторые методы, которые являются общедоступными, а имя начинается с get:

Set<Method> getters = ReflectionUtils.getAllMethods(SomeClass.class, ReflectionUtils.withModifier(Modifier.PUBLIC), ReflectionUtils.withPrefix("get"));
0 голосов
/ 23 октября 2008

Нет, вы не можете этого сделать, но вы можете получить список методов класса и применить к ним регулярное выражение.

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

Ну как-то так ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...