web-dev-qa-db-ja.com

Javaクラスに特定のメソッドが含まれているかどうかを確認する方法は?

変化し続けるxmlスキーマ(trangを使用して自動的に生成)があります。これらの変更はそれほど複雑ではありません。一部の要素のみがこのスキーマに追加または削除されます。このスキーマから、XMLドキュメントをアンマーシャリングするためのJavaクラス(cxfを使用))を生成しています。

スキーマが変更されると、自動生成されたJavaクラスも変更されます。スキーマと同様に、Javaクラスはあまり大きくありません。たとえば、 elemAという要素がスキーマに追加され、自動生成されたJavaクラスにgetElemA()およびsetElemA()という関連関数が追加されます。

これらの自動生成されたクラスに特定の関数が存在することをどのように確認しますか? 1つの解決策は、xmlのすべての可能な要素がカバーされるようにスキーマを手書きすることです。これが最終的に私がやることです。しかし、今のところ、xmlファイルの形式は修正していません。

更新:

メソッドgetElemA()が自動生成クラスで定義される可能性があります。これらのクラスの自動生成を制御することはできません。しかし、私のメインクラスでは、次のコードがある場合、

If method getElemA exists then 
     ElemA elemA = getElemA()

このコードは常にメインクラスにあります。自動生成されたクラスの1つでメソッドgetElemA()が生成された場合、問題はありません。しかし、このメソッドが生成されない場合、コンパイラは、このメソッドがどのクラスにも存在しないことを訴えます。

コンパイル時にこの関数について文句を言わないようにコンパイラを作成する方法はありますか?

24
Dilawar

1つのメソッドは@missingfaktorによって言及され、もう1つのメソッドは以下に記載されています(APIの名前とパラメーターがわかっている場合)。

引数をとらない1つのメソッドがあるとします。

Method methodToFind = null;
try {
  methodToFind = YouClassName.class.getMethod("myMethodToFind", (Class<?>[]) null);
} catch (NoSuchMethodException | SecurityException e) {
  // Your exception handling goes here
}

存在する場合は呼び出します:

if(methodToFind == null) {
   // Method not found.
} else {
   // Method found. You can invoke the method like
   methodToFind.invoke(<object_on_which_to_call_the_method>, (Object[]) null);
}

ネイティブのintの引数を取るメソッドがあるとします:

Method methodToFind = null;
methodToFind = YouClassName.class.getMethod("myMethodToFind", new Class[] { int.class });

存在する場合は呼び出します:

if(methodToFind == null) {
   // Method not found.
} else {
   // Method found. You can invoke the method like
   methodToFind.invoke(<object_on_which_to_call_the_method>, invoke(this,
      Integer.valueOf(10)));
}

ボックス化されたInteger引数を取る1つのメソッドがあるとします:

Method methodToFind = null;
methodToFind = YouClassName.class.getMethod("myMethodToFind", new Class[] { Integer.class });

存在する場合は呼び出します:

if(methodToFind == null) {
   // Method not found.
} else {
   // Method found. You can invoke the method like
   methodToFind.invoke(<object_on_which_to_call_the_method>, invoke(this,
      Integer.valueOf(10)));
}

上記のsolnを使用してメソッドを呼び出しても、コンパイルエラーは発生しません。 @Foumpieに従って更新

40
havexz

reflection を使用します。

import Java.lang.reflect.Method;

boolean hasMethod = false;
Method[] methods = foo.getClass().getMethods();
for (Method m : methods) {
  if (m.getName().equals(someString)) {
    hasMethod = true;
    break;
  }
}

編集:

したがって、メソッドが存在する場合は呼び出します。これがあなたのやり方です:

if (m.getName().equals(someString)) {
  try {
    Object result = m.invoke(instance, argumentsArray);
    // Do whatever you want with the result.
  } catch (Exception ex) { // For simplicity's sake, I am using Exception.
                           // You should be handling all the possible exceptions
                           // separately.
    // Handle exception.
  }
}
20
missingfaktor

春の場合:

Method method = ReflectionUtils.findMethod(TheClass, "methodName");
if (method != null) {
  //do what you want
}
10
leaqui

Spring Frameworkを使用する場合、最も簡単な方法はReflectionUtils.findMethod()ユーティリティを使用することです。

4
snowindy
1