如何使用java类加载器调用带有参数的scala函数?
我正在寻找一些将scala jar加载到java类加载器的指南。 当我使用JavaJAR文件时,下面的函数适用于我 其中,arr是java.net.URL的数组,用于我需要加载到类加载器中的所有jar如何使用java类加载器调用带有参数的scala函数?,java,scala,reflection,urlclassloader,Java,Scala,Reflection,Urlclassloader,我正在寻找一些将scala jar加载到java类加载器的指南。 当我使用JavaJAR文件时,下面的函数适用于我 其中,arr是java.net.URL的数组,用于我需要加载到类加载器中的所有jar val classLoader = new URLClassLoader(arr, this.getClass().getClassLoader()) val clazz = classLoader.loadClass(className) val myMethod = clazz.getDecl
val classLoader = new URLClassLoader(arr, this.getClass().getClassLoader())
val clazz = classLoader.loadClass(className)
val myMethod = clazz.getDeclaredMethod(methodName, classOf[String])
myMethod.setAccessible(true)
val response = myMethod.invoke(methodName)
然而,当我试图使用类似的方法从scala jar文件调用scala函数时,我在这一行的val clazz=classLoader.loadClass(className)处得到classNotFound异常
val clazz = classLoader.loadClass("com.testing.Test")
我想调用类测试的print方法。有人能给我引路吗?我在SO中检查了其他几篇文章,但它们涉及的对象和特性可能不适用于我的用例
Scala类,例如:
package com.testing
class Test(){
def print (a: String, b: String): String = {
return a+b
}
}
谢谢 这应该和Java类一样有效,因为类加载器应该关心的没有区别,我已经做了很多次了。但一个可能的问题是,如果在
arr
中不包含依赖项;Java和Scala都是如此,但对于Scala,您可能缺少Scala库-.jar
为寻找类似问题的人发布答案。
Classloader在scala和java中都能正常工作
对于Java,只需在method.invoke中传递方法名称对我来说很有效,而在scala中,我必须专门创建一个类的对象,并将该对象传递给method.invoke。对我来说是一个新的学习。我认为你的Scala课堂示例是错误的。这是不可能的
(“a:String,“b:String”)
。很抱歉,我已经更新了它。嗨,Alexey,我已经添加了scala-library-2.11.11.jar,这与我的scala项目的版本相同。你能分享一个示例代码吗,这样我就可以看到我缺少的东西了?这是错误消息,我在sun.misc.Launcher$AppClassLoader.loadClass的java.net.URLClassLoader.findClass(URLClassLoader.java:381)的java.lang.ClassLoader.loadClass(ClassLoader.java:424)的sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)的线程“main”java.lang.ClassNotFoundException中收到异常(ClassLoader.java:357)我所有的例子都在大项目中,没有真正的用处。你可以在以下位置看到一个例子:它只是做了ClassLoader.loadClass
和你的一样。不确定发生了什么,但它现在绕过了我的代码,现在在下一行失败了。val myMethod=clazz.getDeclaredMethod(methodName,classOf[String])线程“main”java.lang.IllegalArgumentException中的.Exception:对象不是声明classIs的实例scala类是否有问题,或者是否需要使用对象?