java - 使用反射从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 的帖子,但这也无济于事。
解决方案
在 Scala 中,List
默认导入的是scala.collection.immutable.List
(如您在消息中看到的);在 Java 中,没有,但此类可能会导入 java.util.List
. 如果 Java 类使用 Scala 列表,它会起作用(但 Scala 集合基本上无法从 Java 中使用)。
所以你应该修复 Scala 类来classOf[java.util.List[AnyRef]]
代替使用。
反射对 javaconversions 和 javaconverters 一无所知,它们不相关。
推荐阅读
- node.js - Node.js - 无需 html 即可直接从浏览器下载的服务文件
- c# - INotifyDataErrorInfo ErrorsChanged 不适用于绑定到 ListCollectionView 的 UI 元素
- python-3.x - 输出保持垂直打印
- ios - 如何连接到不在 iOS 应用程序中广告服务 UUID 的 BLE 设备
- powerbi - 在 Power Pivot / DAX 中创建基于日期范围计算可用设备的度量
- javascript - 通过 react csv 传递 api 数据
- json - 如何在 Power BI 中扩展多维 JSON
- python - Python 3 位运算符问题
- linux - 在 linux 机器上执行许多命令
- cmake - CMake添加以“* .a”结尾的文件