Как проверить, существует ли метод во время выполнения в Java? - PullRequest
17 голосов
/ 14 августа 2011

Как можно проверить, существует ли метод для класса в Java? Будет ли try {...} catch {...} заявление хорошей практикой?

Ответы [ 4 ]

26 голосов
/ 14 августа 2011

Я предполагаю, что вы хотите проверить метод 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 нужно вызывать очень часто, и из-за этого у вас возникают проблемы с производительностью, мне придется придумать более сложный ответ.Это должно быть хорошо на данный момент.

5 голосов
/ 14 августа 2011

Reflection API выдает NoSuchMethodException при использовании Class.getMethod(...) функций.

В противном случае у Oracle есть хороший учебник по рефлексии http://download.oracle.com/javase/tutorial/reflect/index.html

4 голосов
/ 14 августа 2011

В Java это называется отражением. API позволяет обнаруживать методы и вызывать их во время выполнения. Вот указатель на документы. Это довольно многословный синтаксис, но он выполнит свою работу:

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

3 голосов
/ 10 августа 2013

Я бы использовал отдельный метод для обработки исключения и имел бы нулевую проверку, чтобы проверить, существует ли метод

Пример: 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;
} 
...