我正在寻找将scala jar加载到java classloader中的指导。 当我使用Java jar文件时,下面的功能对我有用。
其中,arr是要加载到类加载器中的所有jar的java.net.URL数组。
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异常。 / p>
val clazz = classLoader.loadClass("com.testing.Test")
我想调用Test类的打印方法。有人可以指导吗?我检查了SO中的其他几篇文章,但它们涉及的对象和特征可能不适用于我的用例。
Scala类例如:
package com.testing
class Test(){
def print (a: String, b: String): String = {
return a+b
}
}
谢谢!
答案 0 :(得分:1)
这应该与Java类的工作方式相同,因为类加载器应该关心的没有什么区别,我已经做了很多次了。但是可能的问题是,如果您没有在arr
中包括依赖项;对于Java和Scala都是如此,但是对于Scala,您可能会缺少scala-library-<version>.jar
。
答案 1 :(得分:0)
将答案发布给寻找类似问题的人。 对于Scala和Java,Classloader确实可以正常工作。
对于Java,仅在method.invoke中传递方法名称对我有用,而在scala中,我必须专门创建一个类的对象并将该对象传递给method.invoke。对我来说是新的学习。