私は自分の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のコードで知られているインタフェースを実装していない)だけリフレクションを使用することができ、実行時に未知のタイプを持っている場合は、コードの各行の追加出力が
これは非常に多くのレベルで間違っています...あなたがそれを避けることができれば、反射では決して構築しないでください。 mavenまたはsbtを使用して、そこに依存関係を挿入します。手作りの建物は反射を伴う建物ほど悪いです。 – Chobeat
私は、jarファイルと私のscalaアプリケーションを別々に保たなければなりませんでした。なぜなら、jarファイルは将来の変更の対象となり、scalaアプリケーションはあまり変更されません。だから、アプリケーションを再起動するだけで毎回それを再構築するのではなく、変更を反映させることができます。 – ar7