使用反射从 scala 调用 java class
Invoking java class from scala using reflection
我正在尝试使用反射从 Scala class.
调用我的 java 方法
我提到了这个 post。 而我从 Scala 传递的 "arg" 是一个列表[AnyRef]
斯卡拉
val arg: List[AnyRef] = List ("a",Object B)
val clazz = classLoader.loadClass("com.project.Hello")
val clazzObject = clazz.newInstance()
val myMethod = clazz.getDeclaredMethod("HelloJava", classOf[List[AnyRef]])
myMethod.setAccessible(true)
val response = myMethod.invoke(clazzObject, arg)
Java
package com.project;
public class Hello {
public static String HelloJava (List<Object> arg) {
}
调用此方法时,出现以下异常 -
java.lang.NoSuchMethodException: com.Project.Hello(scala.collection.immutable.List)
在 java.lang.Class.getDeclaredMethod
但是,从 scala 调用 scala class 使用相同的方法签名可以正常工作。
有人可以帮助澄清这个概念并告诉我我做错了什么吗?我如何主要通过更改 java [=41= 来解决这个问题](如果不是,则更改为 scala class)。我还查看了其他 posts,其中提到使用 javaconversions 和 javaconverters,但这也没有帮助。
在Scala中,默认导入的List
是scala.collection.immutable.List
(在消息中可以看到);在 Java 中,有 none,但是这个 class 可能导入 java.util.List
。如果 Java class 使用 Scala 列表,它会工作(但 Scala 集合基本上无法从 Java 使用)。
因此您应该修复 Scala class 以使用 classOf[java.util.List[AnyRef]]
。
Reflection 对 javaconversions 和 javaconverters 一无所知,它们不相关。
我正在尝试使用反射从 Scala class.
调用我的 java 方法我提到了这个 post。
斯卡拉
val arg: List[AnyRef] = List ("a",Object B)
val clazz = classLoader.loadClass("com.project.Hello")
val clazzObject = clazz.newInstance()
val myMethod = clazz.getDeclaredMethod("HelloJava", classOf[List[AnyRef]])
myMethod.setAccessible(true)
val response = myMethod.invoke(clazzObject, arg)
Java
package com.project;
public class Hello {
public static String HelloJava (List<Object> arg) {
}
调用此方法时,出现以下异常 - java.lang.NoSuchMethodException: com.Project.Hello(scala.collection.immutable.List) 在 java.lang.Class.getDeclaredMethod
但是,从 scala 调用 scala class 使用相同的方法签名可以正常工作。
有人可以帮助澄清这个概念并告诉我我做错了什么吗?我如何主要通过更改 java [=41= 来解决这个问题](如果不是,则更改为 scala class)。我还查看了其他 posts,其中提到使用 javaconversions 和 javaconverters,但这也没有帮助。
在Scala中,默认导入的List
是scala.collection.immutable.List
(在消息中可以看到);在 Java 中,有 none,但是这个 class 可能导入 java.util.List
。如果 Java class 使用 Scala 列表,它会工作(但 Scala 集合基本上无法从 Java 使用)。
因此您应该修复 Scala class 以使用 classOf[java.util.List[AnyRef]]
。
Reflection 对 javaconversions 和 javaconverters 一无所知,它们不相关。