31

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

スキーマが変更されると、自動生成されたJavaクラスも変更されます。繰り返しますが、スキーマと同様に、Javaクラスの変更はそれほど大きくありません。たとえば、要素sayelemAがスキーマに追加された場合。いくつかの関連する関数はgetElemA()setElemA()自動生成されたJavaクラスに追加されます。

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

アップデート :

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

If method getElemA exists then 
     ElemA elemA = getElemA()

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

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

4

6 に答える 6

49

1つのメソッドは@missingfaktorによって言及されており、別のメソッドは以下にあります(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ネイティブ引数を取るメソッドが1つあるとします。

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に従って更新

于 2012-06-04T05:32:51.957 に答える
24

反射を使用します。

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.
  }
}
于 2012-06-04T05:21:23.767 に答える
11

春の場合:

Method method = ReflectionUtils.findMethod(TheClass, "methodName");
if (method != null) {
  //do what you want
}
于 2016-01-07T19:20:15.520 に答える
4

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

于 2014-01-10T13:16:17.470 に答える
2

もう1つの方法は、Java8ストリームを使用することです。

  Optional<Method> methodToFind =
                Arrays.stream(clazz.getMethods()).
                        filter(method -> "methodName".equals(method.getName())).
                        findFirst();
        if (methodToFind.isPresent()) {
            // invoke method or any logic needed
            ///methodToFind.get().
        }
于 2020-05-10T14:07:58.113 に答える
1

JavaでReflectionを使用できますhttp://docs.oracle.com/javase/tutorial/reflect/index.html

またはhttp://docs.oracle.com/javase/tutorial/reflect/member/methodType.html

于 2012-06-04T05:12:20.390 に答える