2017-02-02 2 views
0

У меня есть JAR-файл с java-классами, который я хочу использовать в своем приложении scala. Я не хочу добавлять JAR в папку lib/, потому что я не хочу перестраивать приложение scala каждый раз при изменении JAR.Загрузить класс java в scala во время выполнения

Итак, я попробовал свои силы с помощью scala-отражений и загрузчиков классов, и мне удалось загрузить класс, но я не знаю, как использовать методы класса дальше в моем приложении scala.

Вот моя попытка до сих пор,

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 из вновь загруженного класса.

Как я могу пойти дальше, чтобы создать объект этого класса и использовать его методы?

Edit: Добавлен вывод для каждой строки кода выполняется

+1

это не так на многих уровнях ... вы никогда не должны строить с отражением, если можете избежать этого. Используйте maven или sbt и вставьте туда свою зависимость. Ручное здание так же плохо, как здание с отражением. – Chobeat

+0

Мне пришлось держать банку и мое приложение scala отдельно, потому что банка подвержена будущим изменениям, когда мое приложение scala не будет сильно меняться. Поэтому просто перезапуская приложение, я могу вносить изменения, а не перестраивать его каждый раз. – ar7

ответ

1

Если загруженный класс имеет тип неизвестную во время выполнения (например, он не реализует интерфейс, известный вашим кодом Scala), вы можете использовать только отражение для доступа к полям и методам запуска.

Как я могу идти дальше, чтобы создать объект этого конкретного класса

Если класс не имеет публичного конструктора без аргументов, вы можете построить его с javaClass.newInstance(), иначе вы должны найти правильный конструктор (аналогично тому, как вы делали при перечислении методов, есть несколько способов) и называть его. См. http://tutorials.jenkov.com/java-reflection/constructors.html для получения более подробной информации

и используйте его методы?

Вы получаете надлежащий Method объект от класса и называете его myMethod.invoke(myObject, args). См. http://tutorials.jenkov.com/java-reflection/methods.html.

+0

Извините, но я не могу это понять. Поскольку класс неизвестен scala, он не может получить то, что находится внутри класса во время выполнения? Я редактировал вопрос, чтобы включить выходы, если это помогает. – ar7

1

Поскольку вы хотите иметь возможность загружать банку при перезагрузке, вам не нужно возиться с отражением. Просто у вас есть java jar где-то на пути к классу за пределами вашего scala jar. Когда вы обновляете банку, просто замените ее на новую версию. Пока не было никаких изменений, вам не понадобится перестраивать банку scala.

+0

Я относительно новичок в создании приложений scala. Какую classpath мне нужно добавить для создания приложения? И как? – ar7

+0

Путь к классу приложения при его запуске. Самый простой способ - добавить «Class-Path: ./*» в файл manifest.mf в вашем банке, который добавит банки в текущий каталог в ClassPath. Вы также можете указать конкретный путь, если хотите.вы также можете использовать 'java -cp <объекты pathpath>

' для запуска программы. Имейте в виду, что вам нужно будет добавить свой scala jar в список маршрутов классов, используя этот метод. – puhlen

Смежные вопросы