Javaのクラスにメソッドが存在するかどうかを確認する方法を教えてください。 try {...} catch {...}
ステートメントは良い習慣ですか?
メソッド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
を頻繁に呼び出す必要があり、そのためにパフォーマンスの問題が発生した場合、より高度な答えを考えなければなりません。これは今のところ問題ないはずです。
Class.getMethod(...)
関数を使用すると、Reflection APIはNoSuchMethodException
をスローします。
それ以外の場合、Oracleにはリフレクションに関する素晴らしいチュートリアルがあります http://download.Oracle.com/javase/tutorial/reflect/index.html
Javaこれはリフレクションと呼ばれます。APIを使用すると、メソッドを検出して、実行時にそれらを呼び出すことができます。ドキュメントへのポインタを次に示します。かなり冗長な構文ですが、作業は完了します。
http://Java.Sun.com/developer/technicalArticles/ALT/Reflection/
例外を処理するために別のメソッドを使用し、メソッドが存在するかどうかをチェックする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;
}