首页 > 解决方案 > 使用反射从scala调用java类

问题描述

我正在尝试使用反射从 scala 类中调用我的 java 方法。

我提到了这篇文章。scala:Any 和 AnyRef 有什么区别?我从 Scala 传递的“arg”是一个 List[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)

爪哇

package com.project;
     public class Hello {
        public static String HelloJava (List<Object> arg) {
        }

在调用此方法时,我遇到了异常 - java.lang.NoSuchMethodException: com.Project.Hello(scala.collection.immutable.List) at java.lang.Class.getDeclaredMethod

但是,使用相同的方法签名从 scala 调用 scala 类可以正常工作。

有人可以帮助澄清这个概念并告诉我我做错了什么吗?我如何主要通过更改 java 类来解决此问题(如果没有,则更改为 scala 类)。我还查看了其他有关使用 javaconversions 和 javaconverters 的帖子,但这也无济于事。

标签: javascalareflectionscala-collections

解决方案


在 Scala 中,List默认导入的是scala.collection.immutable.List(如您在消息中看到的);在 Java 中,没有,但此类可能会导入 java.util.List. 如果 Java 类使用 Scala 列表,它会起作用(但 Scala 集合基本上无法从 Java 中使用)。

所以你应该修复 Scala 类来classOf[java.util.List[AnyRef]]代替使用。

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


推荐阅读