【问题标题】:Java Reflection in ScalaScala 中的 Java 反射
【发布时间】:2016-08-22 16:59:37
【问题描述】:

我正在尝试让一个简单的 Java 反射程序在 Scala 中运行,但似乎缺少一些东西......

scala> val cl = new URLClassLoader(Array(new File("Hi.jar").toURI.toURL), getClass.getClassLoader)
cl: java.net.URLClassLoader = java.net.URLClassLoader@3c7b137a

scala> val c = cl.loadClass("Hi")
c: Class[_] = class Hi

scala> val m = c.getMethod("run")
m: java.lang.reflect.Method = public void Hi.run()

scala> m.invoke()
<console>:21: error: not enough arguments for method invoke: (x$1: Any, x$2: Object*)Object.
Unspecified value parameters x$1, x$2.
       m.invoke()
               ^

我错过了什么,如前一行所示 -

public void Hi.run()

这两个参数到底是什么?

【问题讨论】:

    标签: java scala reflection


    【解决方案1】:

    Scala 准确地告诉你你的问题是什么:调用需要 1+ 个参数!

    java doc

    invoke(Object obj, Object... args)

    在具有指定参数的指定对象上调用此 Method 对象表示的底层方法。

    因此,您必须提供至少一个参数 - 对您要调用该方法的对象(或类)的引用!由于 Hi.run() 似乎是静态的,您可能希望使用您的 c 作为调用的唯一参数。

    以下参数将是您的“反射”方法所期望的实际参数。在你的情况下,没有进一步的论点。

    长话短说:您最好在实验时将来自Oracle 的优秀教程放在您的 scala 控制台附近进行反思。如果你尝试通过试错来学习“反思”;我向你保证:很多令人沮丧的试验带有许多奇怪的错误。真的:当你不知道自己在做什么时,反射 API 不是很宽容;即使是最轻微的错误也可能导致非常意想不到的结果。

    【讨论】:

      【解决方案2】:

      那里没有什么是 Scala 特有的。 Method.invoke 需要至少一个参数是它所应用的实例(或 null 用于 static 方法)。

      在 Scala 中,您可以对这种简单的情况使用结构类型。

      【讨论】:

        猜你喜欢
        • 2012-11-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        • 2010-12-22
        • 2019-02-18
        相关资源
        最近更新 更多