如何在Java中检查运行时是否存在方法?

时间:2011-08-14 17:56:23

标签: java methods try-catch exists

如何检查Java中是否存在类的方法? try {...} catch {...}陈述是否是良好做法?

6 个答案:

答案 0 :(得分:25)

我假设您要检查方法doSomething(String, Object)

你可以试试这个:

boolean methodExists = false;
try {
  obj.doSomething("", null);
  methodExists = true;
} catch (NoSuchMethodError e) {
  // ignore
}

这不起作用,因为该方法将在编译时解决。

你真的需要使用反射。如果您可以访问要调用的方法的源代码,那么使用您要调用的方法创建接口会更好。

[更新]附加信息是:有一个接口可能存在两个版本,一个旧版本(没有想要的方法)和一个新版本(使用想要的方法)。基于此,我建议如下:

package so7058621;

import java.lang.reflect.Method;

public class NetherHelper {

  private static final Method getAllowedNether;
  static {
    Method m = null;
    try {
      m = World.class.getMethod("getAllowedNether");
    } catch (Exception e) {
      // doesn't matter
    }
    getAllowedNether = m;
  }

  /* Call this method instead from your code. */
  public static boolean getAllowedNether(World world) {
    if (getAllowedNether != null) {
      try {
        return ((Boolean) getAllowedNether.invoke(world)).booleanValue();
      } catch (Exception e) {
        // doesn't matter
      }
    }
    return false;
  }

  interface World {
    //boolean getAllowedNether();
  }

  public static void main(String[] args) {
    System.out.println(getAllowedNether(new World() {
      public boolean getAllowedNether() {
        return true;
      }
    }));
  }
}

此代码测试接口中是否存在方法getAllowedNether,因此实际对象是否具有该方法无关紧要。

如果必须经常调用方法getAllowedNether并因此遇到性能问题,我将不得不考虑更高级的答案。这个应该没问题。

答案 1 :(得分:5)

使用NoSuchMethodException函数时,Reflection API会抛出Class.getMethod(...)

否则Oracle有一个很好的关于反射http://download.oracle.com/javase/tutorial/reflect/index.html

的教程

答案 2 :(得分:4)

在java中,这称为反射。 API允许您发现方法并在运行时调用它们。这是一个指向文档的指针。这是非常详细的语法,但它将完成工作:

http://java.sun.com/developer/technicalArticles/ALT/Reflection/

答案 3 :(得分:3)

我会使用一个单独的方法来处理异常并进行空检查以检查方法是否存在

Ex:if(null!= getDeclaredMethod(obj,“getId”,null))做你的东西......

private Method getDeclaredMethod(Object obj, String name, Class<?>... parameterTypes) {
    // TODO Auto-generated method stub
    try {
        return obj.getClass().getDeclaredMethod(name, parameterTypes);
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
} 

答案 4 :(得分:1)

如果您在项目中使用Spring,则可以选中ReflectionUtil.findMethod(..)。如果方法不存在或不符合您的要求,则返回null。 Documentation

答案 5 :(得分:1)

Roland Illig 是正确的,但想添加一个示例,说明如何使用 Class.getMethod 检查是否存在需要参数的方法。如果您尝试访问私有方法,也可以使用 Class.getDeclaredMethod

class World {
    public void star(String str) {}
    private void mars(String str) {}
}
try {
    World.class.getMethod("star", String.class);
    World.class.getDeclaredMethod("mars", String.class);
} catch (Exception e) {}