使用反射从 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中,默认导入的Listscala.collection.immutable.List(在消息中可以看到);在 Java 中,有 none,但是这个 class 可能导入 java.util.List。如果 Java class 使用 Scala 列表,它会工作(但 Scala 集合基本上无法从 Java 使用)。

因此您应该修复 Scala class 以使用 classOf[java.util.List[AnyRef]]

Reflection 对 javaconversions 和 javaconverters 一无所知,它们不相关。