2009-08-24 14 views
2

これはマクドウェルは、コードで応答How does one access a method from an external jar at runtime?実行時に外部jarからメソッドにアクセスするにはどうすればいいですか(part2)?

ポストの続きである:

public void print2(String[] strs){ 
    for(final String string : strs){ 
     System.out.println(string); 
    } 
} 

との2行含むようにメイン修飾:

を私は次のメソッドを追加

public class ReflectionDemo { 

public void print(String str, int value) { 
    System.out.println(str); 
    System.out.println(value); 
} 

public static int getNumber() { return 42; } 

public static void main(String[] args) throws Exception { 
    Class<?> clazz = ReflectionDemo.class; 
    // static call 
    Method getNumber = clazz.getMethod("getNumber"); 
    int i = (Integer) getNumber.invoke(null /* static */); 
    // instance call 
    Constructor<?> ctor = clazz.getConstructor(); 
    Object instance = ctor.newInstance(); 
    Method print = clazz.getMethod("print", String.class, Integer.TYPE); 
    print.invoke(instance, "Hello, World!", i); 
    } 
} 

Method print2 = clazz.getDeclaredMethod("print2", new Class[]{String[].class}); 
print2.invoke(instance, new String[]{"test1", "test2"}); 

しかし、代わりに

test1の
test2の

を見ての私は次の例外を取得:スレッドで

例外 "メイン" java.lang.IllegalArgumentExceptionが:私が持っている引数

の間違った番号を私はSun Javaチュートリアルを実行した後、呼び出す前に独自のオブジェクトを引数として渡しましたが、配列を再ロードしましたが、すべて成功しませんでした。誰も私がここで間違っていることを説明することはできますか?

おかげで、 トッド

答えて

3

このような可変引数に問題があります!

print2.invoke(instance, new Object[] { new String[] {"test1", "test2"}}); 
+0

うん、呼び出しは(Object、Object ...)ということに注意してください。つまり、2番目のパラメータは技術的にObject []でなければならないので、渡しているすべての引数は上記のように渡されなければなりません。ヤック:-D –

+0

@tackline、@ブレント、ありがとう。私はこれ以上の髪の部門ではるかに軽いです。接着剤、私は接着剤が必要です! – Todd

関連する問題