如何使用Java类加载器调用带参数的Scala函数?

时间:2018-07-27 01:44:33

标签: java scala reflection urlclassloader

我正在寻找将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
      }
    }

谢谢!

2 个答案:

答案 0 :(得分:1)

这应该与Java类的工作方式相同,因为类加载器应该关心的没有什么区别,我已经做了很多次了。但是可能的问题是,如果您没有在arr中包括依赖项;对于Java和Scala都是如此,但是对于Scala,您可能会缺少scala-library-<version>.jar

答案 1 :(得分:0)

将答案发布给寻找类似问题的人。 对于Scala和Java,Classloader确实可以正常工作。

对于Java,仅在method.invoke中传递方法名称对我有用,而在scala中,我必须专门创建一个类的对象并将该对象传递给method.invoke。对我来说是新的学习。