変化し続ける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()
が生成された場合、問題はありません。しかし、このメソッドが生成されない場合、コンパイラは、このメソッドがどのクラスにも存在しないことを訴えます。
コンパイル時にこの関数について文句を言わないようにコンパイラを作成する方法はありますか?
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に従って更新
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.
}
}
春の場合:
Method method = ReflectionUtils.findMethod(TheClass, "methodName");
if (method != null) {
//do what you want
}
Spring Frameworkを使用する場合、最も簡単な方法はReflectionUtils.findMethod()
ユーティリティを使用することです。