2017-02-02 18 views
0

私は自分のscalaアプリケーションで使用したいJavaクラスを持つJARファイルを持っています。私は、JARが変更されるたびに私のスカラアプリケーションを再構築したくないので、のlib/フォルダにJARを追加したくありません。実行時にスカラでjavaクラスをロード

スカラリフレクションとクラスローダーを手に入れましたが、クラスをロードすることはできましたが、私のスカラアプリケーションでクラスのメソッドを使用する方法はわかりません。ここで

は、これまでの私の試みで、

scala> var classLoader = new java.net.URLClassLoader(Array(new File("java-module.jar").toURI.toURL),this.getClass.getClassLoader) 
classLoader: java.net.URLClassLoader = [email protected] 

scala> var javaClass = classLoader.loadClass("com.sample.myClass") 
javaClass: Class[_] = class com.sample.myClass 

scala> javaClass.getMethods.foreach(println) 
public java.lang.String com.sample.myClass.myMethod(java.lang.String) 
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException 
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException 
public final void java.lang.Object.wait() throws java.lang.InterruptedException 
public boolean java.lang.Object.equals(java.lang.Object) 
public java.lang.String java.lang.Object.toString() 
public native int java.lang.Object.hashCode() 
public final native java.lang.Class java.lang.Object.getClass() 
public final native void java.lang.Object.notify() 
public final native void java.lang.Object.notifyAll() 

は私が新しくロードされたクラスからをMyMethodはメソッドを使用します。

この特定のクラスのオブジェクトを作成し、そのメソッドを使用するにはどうすればよいですか?

編集:ロードされたクラスは、(例えば、それはあなたのScalaのコードで知られているインタフェースを実装していない)だけリフレクションを使用することができ、実行時に未知のタイプを持っている場合は、コードの各行の追加出力が

+1

これは非常に多くのレベルで間違っています...あなたがそれを避けることができれば、反射では決して構築しないでください。 mavenまたはsbtを使用して、そこに依存関係を挿入します。手作りの建物は反射を伴う建物ほど悪いです。 – Chobeat

+0

私は、jarファイルと私のscalaアプリケーションを別々に保たなければなりませんでした。なぜなら、jarファイルは将来の変更の対象となり、scalaアプリケーションはあまり変更されません。だから、アプリケーションを再起動するだけで毎回それを再構築するのではなく、変更を反映させることができます。 – ar7

答えて

1

を実行フィールドにアクセスしてメソッドを実行します。

どのように私はさらに行くことができ、この特定のクラスのオブジェクトを作成するために

クラスは公共引数なしのコンストラクタを持っている場合、あなたは右を見つける必要がある他、javaClass.newInstance()でそれを構築することができますコンストラクタ(メソッドをリストするときと同じように、いくつかの方法があります)を呼び出して呼び出します。詳細については、http://tutorials.jenkov.com/java-reflection/constructors.htmlを参照してください。

を使用していますか?

Methodオブジェクトがクラスから取得され、myMethod.invoke(myObject, args)のように呼び出されます。詳細は、http://tutorials.jenkov.com/java-reflection/methods.htmlを参照してください。

+0

申し訳ありません私はそれをはっきり理解できません。クラスはスケーラには未知であるため、実行時にクラス内にあるものを取得できません。 出力を含めるように質問を編集しました。 – ar7

1

再起動時にjarをロードしたいので、リフレクションを混乱させる必要はありません。あなたのスカラ瓶の外にあるクラスパスのどこかにあなたのJavaジャーを持ってください。 jarを更新するときには、新しいバージョンに置き換えてください。急激な変化がない限り、スカラ・ジャーを再構築する必要はありません。

+0

私は比較的新しいスカラーアプリケーションを構築しています。アプリケーションをビルドするために、どのクラスパスを追加する必要がありますか?そしてどうやって? – ar7

+0

アプリケーションを実行するときのクラスパス。最も簡単な方法は、あなたのjarのmanifest.mfファイルに 'Class-Path:./*'を追加することです。これにより、カレントディレクトリのjarがClassPathに追加されます。必要に応じて特定のパスを指定することもできます。'java -cp

'を使ってプログラムを起動することもできます。このメソッドを使用してクラスパスリストにスカラーjarを追加する必要があることに注意してください。 – puhlen

関連する問題