如何使用 java 类加载器调用带参数的 Scala 函数?
How to call a scala function with parameters using java classloader?
我正在寻找将 scala jar 加载到 java classloader 的指导。
当我使用 java jar 文件时,下面的函数对我有用。
其中,arr 是一个 java.net.URL 数组,用于我需要加载到 classloader 中的所有 jar。
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( class名称) 在这一行。
val clazz = classLoader.loadClass("com.testing.Test")
我想调用 class 测试的打印方法。有人可以指导吗?我检查了 SO 中的其他几个帖子,但它们正在处理可能不适用于我的用例的对象和特征。
Scala class 例如:
package com.testing
class Test(){
def print (a: String, b: String): String = {
return a+b
}
}
谢谢!
这应该与 Java 类 的工作方式相同,因为类加载器应该关心的没有区别,我已经做过很多次了。但是一个可能的问题是如果你不在 arr
中包含依赖项; Java 和 Scala 都是如此,但对于 Scala,您可能缺少 scala-library-<version>.jar
.
为寻找类似问题的人发布答案。
Classloader 对 scala 和 java.
都按预期工作
对于 Java,只需在 method.invoke 中传递方法名称对我有用,而在 Scala 中,我必须专门创建一个 class 的对象并将该对象传递给 method.invoke。对我来说是一个新的学习。
我正在寻找将 scala jar 加载到 java classloader 的指导。 当我使用 java jar 文件时,下面的函数对我有用。
其中,arr 是一个 java.net.URL 数组,用于我需要加载到 classloader 中的所有 jar。
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( class名称) 在这一行。
val clazz = classLoader.loadClass("com.testing.Test")
我想调用 class 测试的打印方法。有人可以指导吗?我检查了 SO 中的其他几个帖子,但它们正在处理可能不适用于我的用例的对象和特征。
Scala class 例如:
package com.testing
class Test(){
def print (a: String, b: String): String = {
return a+b
}
}
谢谢!
这应该与 Java 类 的工作方式相同,因为类加载器应该关心的没有区别,我已经做过很多次了。但是一个可能的问题是如果你不在 arr
中包含依赖项; Java 和 Scala 都是如此,但对于 Scala,您可能缺少 scala-library-<version>.jar
.
为寻找类似问题的人发布答案。 Classloader 对 scala 和 java.
都按预期工作对于 Java,只需在 method.invoke 中传递方法名称对我有用,而在 Scala 中,我必须专门创建一个 class 的对象并将该对象传递给 method.invoke。对我来说是一个新的学习。