2

URLClassLoader を使用して Java クラスをロードし、メソッド main を呼び出したいと考えています。以下のコードでは、最後の行でエラーが発生し、修正方法がわかりません。

(def classloader (URLClassLoader. (into-array files)))

(定義クラス名 "example.Test")
(def clazz (.. classloader (loadClass クラス名)))

; メソッド「メイン」を取得する最も効果的な方法ではないと思います
; 追加のフィードバックを歓迎します
(def メソッド (first (filter #(= (. % getName) "main") (. clazz getMethods))))

(def args (make-array 文字列 1))
; メソッド main(String[]args) に 1 つのコマンド ライン引数を指定します。
(aset args 0 "my-file")

; Java リフレクション API を使用して静的メソッドを呼び出そうとすると失敗します。
(. メソッドは nil args を呼び出します)

スレッド「メイン」での例外 java.lang.IllegalArgumentException:
引数の型が一致しません。コンパイル中:

それ以外の場合、クラスはデフォルトのクラスローダーでは使用できないことに注意してください。

 (例.Test/メインの「myfile」)

失敗するでしょう。

ありがとう、パベル

4

2 に答える 2

1

invoke のシグネチャと main メソッドのシグネチャを混同しています。

"main" の署名は (String[] args1) です "invoke" の署名は (Object obj, Object... args2) です

args2 は、メイン メソッドの各パラメーターごとに 1 つの項目を持つ配列である必要があるため、1 つの要素の配列である必要があり、要素は String[] です。そう:

(def invoke-args (into-array Object [args]))
(. method invoke nil invoke-args)

「メイン」を見つける簡単な方法については、 http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getMethod(java.lang.String, %20java.lang.クラス...)

于 2015-02-11T12:51:09.087 に答える