我可以使用正则表达式在java中的类上查找方法吗?

时间:2008-10-22 19:51:29

标签: java reflection

我知道如何使用固定字符串

在java中查找方法
someClass.getMethod("foobar", argTypes);

但有没有办法使用正则表达式而不是固定字符串来查找给定类的方法?

如果我想找到一个名为“foobar”或“fooBar”的方法,可能会使用一个例子。使用像“foo [Bb] ar”这样的正则表达式将与这些方法名称匹配。

5 个答案:

答案 0 :(得分:5)

您应该在getDeclaredMethods()反射方法(或GetMethods()上应用正则表达式,如果您只想要公开的那些)。

[警告:如果有安全管理器,这两种方法都会抛出SecurityException。]

将它应用于getDeclaredMethod()返回的每个方法的每个名称,并且只在Collection中记住兼容的方法。

类似的东西!

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 :(得分:1)

不直接。您可以遍历所有方法并检查每个方法。

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

答案 2 :(得分:1)

你可以通过遍历类上的所有方法并以这种方式匹配它来完成它。

不是那么简单,但它可以解决问题

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

答案 3 :(得分:0)

不,你不能这样做,但是你可以获得一个类的方法列表并将regexp应用于它们。

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

那样的东西......

答案 4 :(得分:0)

当我想使用简单的名称模式查找某些方法时,我使用此org.reflections

例如,查找一些公共方法,名称以get开头:

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