web-dev-qa-db-ja.com

Javaの実行時にメソッドが存在するかどうかを確認する方法

Javaのクラスにメソッドが存在するかどうかを確認する方法を教えてください。 try {...} catch {...}ステートメントは良い習慣ですか?

18
jrtc27

メソッドdoSomething(String, Object)を確認するとします。

あなたはこれを試すかもしれません:

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

メソッドはコンパイル時に解決されるため、これは機能しません。

あなたは本当にそれのために反射を使用する必要があります。呼び出すメソッドのソースコードにアクセスできる場合は、呼び出すメソッドを使用してインターフェイスを作成することをお勧めします。

[更新]追加情報は次のとおりです。古いバージョン(必要なメソッドなし)と新しいバージョン(必要なメソッドあり)の2つのバージョンに存在する可能性のあるインターフェイスがあります。これに基づいて、私は以下を提案します:

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を頻繁に呼び出す必要があり、そのためにパフォーマンスの問題が発生した場合、より高度な答えを考えなければなりません。これは今のところ問題ないはずです。

26
Roland Illig

Class.getMethod(...)関数を使用すると、Reflection APIはNoSuchMethodExceptionをスローします。

それ以外の場合、Oracleにはリフレクションに関する素晴らしいチュートリアルがあります http://download.Oracle.com/javase/tutorial/reflect/index.html

5
Jaka

Javaこれはリフレクションと呼ばれます。APIを使用すると、メソッドを検出して、実行時にそれらを呼び出すことができます。ドキュメントへのポインタを次に示します。かなり冗長な構文ですが、作業は完了します。

http://Java.Sun.com/developer/technicalArticles/ALT/Reflection/

4
bcurren

例外を処理するために別のメソッドを使用し、メソッドが存在するかどうかをチェックするnullチェックがあります

例: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;
} 
3
Supun Sameera