2012-06-04 7 views
16

私はxmlスキーマを持っています(trangを使って自動的に生成されます)。これらの変更はあまり精巧ではありません。このスキーマからは、一部の要素のみが追加または削除されます。このスキーマから、私はXML文書をアンマーシャリングするJavaクラス(cxfを使用)を生成しています。Javaクラスに特定のメソッドがあるかどうかをチェックする方法?

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

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

UPDATE:

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

If method getElemA exists then 
    ElemA elemA = getElemA() 

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

コンパイル時にコンパイル時にこの関数について不平を言うことができない方法はありますか?

答えて

32

一つの方法は、@missingfaktorで言及されており、(あなたは、APIの名前とパラメータを知っていれば)別のは以下の通りです。

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>, (Object[]) null); 
} 

あなたはネイティブint引数を取る一つの方法を持っていると言う本があれば

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>, invoke(this, 
     Integer.valueOf(10))); 
} 

あなたが箱入りInteger引数を取るの一つの方法があるだろう:メソッドを呼び出すために、上記のSOLNを使用し

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))); 
} 

エラーをコンパイル与えることはありません。現在は場合

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

がそれを起動します。 @Foumpieで更新

+0

ありがとうございます。私はこのメソッドを使いたいので、そのクラスにすべてのメソッドを記述しなければならないが、自動生成されたクラスはそのメソッドを持たないかもしれない。コンパイラをコンパイル時に無視する方法は? – Dilawar

+0

invokeを使用すると、コンパイルエラーが発生します...更新されたansを確認してください。 – havexz

+0

ありがとうございました。 'try-catch'で囲んだ後、それは魅力的に機能しました。 – Dilawar

17

使用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. 
    } 
} 
+0

感謝。主な問題は、メソッド 'getA'が存在することを認識していても、その関数を書く必要があることです。たとえば、 'methodAが存在する場合はmethodA()'のようになります。このメソッドは終了しないため、コンパイル時エラーが発生しています。コンパイルを実行して実行時検査にする方法を教えてください。 – Dilawar

+0

@Dilawar、あなたの質問は明確ではありません。言い直してください。 – missingfaktor

+1

@Dilawar、それはあなたがそれがたくさん必要になると思われるので、いくつかの反射チュートリアルを熟読する必要があります。 – missingfaktor

4

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

8

:コードの

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