在运行时在scala中加载java类

在运行时在scala中加载java类,scala,reflection,Scala,Reflection,我有一个包含java类的JAR文件,我想在scala应用程序中使用它。我不想将JAR添加到lib/文件夹中,因为我不想在每次更改JAR时重新构建scala应用程序 所以我尝试了scala反射和类加载器,我能够加载该类,但我不知道如何在scala应用程序中进一步使用该类的方法 这是我迄今为止的尝试 scala> var classLoader = new java.net.URLClassLoader(Array(new File("java-module.jar").toURI.toURL

我有一个包含java类的JAR文件,我想在scala应用程序中使用它。我不想将JAR添加到lib/文件夹中,因为我不想在每次更改JAR时重新构建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 = java.net.URLClassLoader@130b3958

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代码已知的接口),则只能使用反射来访问字段和运行方法

如何进一步创建此特定类的对象

如果类有一个公共的无参数构造函数,可以使用
javaClass.newInstance()
来构造它,否则需要找到正确的构造函数(与列出方法时类似,有几种方法)并调用它。有关详细信息,请参阅

使用它的方法


从类中获得适当的
方法
对象,并像调用
myMethod.invoke(myObject,args)
一样调用它。有关详细信息,请参阅。

因为您希望能够在重新启动时加载jar,所以不需要处理反射。只需将java jar放在scala jar之外的类路径上。更新jar时,只需将其替换为新版本即可。只要没有破坏性的更改,您就不需要重建scala jar。

这在很多级别上都是错误的。。。如果可以避免的话,你永远不应该用反射来构建。使用maven或sbt并在其中插入依赖项。手动构建和使用反射构建一样糟糕。我必须将jar和我的scala应用程序分开保存,因为jar将来会发生变化,而我的scala应用程序不会有太大变化。因此,只要重新启动应用程序,我就可以带来更改,而不是每次都重建它。对不起,我不能清楚地理解它。因为scala不知道该类,所以它无法在运行时获取该类内部的内容?如果有帮助的话,我已经编辑了这个问题以包含输出。我对构建scala应用程序相对较新。为了构建应用程序,我必须将其添加到哪个类路径?如何运行?运行应用程序时的类路径。最简单的方法是将
类路径:./*
添加到jar中的manifest.mf文件中,这将把当前目录中的jar添加到类路径中。如果您愿意,还可以指定特定路径。您还可以使用
java-cp
启动该程序。请记住,您还需要使用此方法将scala jar添加到类路径列表中。