【问题标题】:Can Scala reflect static method?Scala可以反映静态方法吗?
【发布时间】:2014-10-08 13:39:19
【问题描述】:

我有一个 java 库,我想通过 Scala 使用反射从库中调用一些静态函数。我尝试使用我创建URLClassloader 并通过getDeclaredMethod() 反映该方法的java 方式,但它似乎在Scala 中不起作用。我在考虑 Scala 的方式,但如果没有创建特定的实例,似乎没有方法或字段可以反映。 那么是否可以在Scala中反映静态方法?如果是,正确的做法是什么?

对不起,我想我犯了一个错误,它适用于 java api。谢谢大佬。。

【问题讨论】:

  • “它似乎在 Scala 中不起作用” 不工作到底如何?
  • 你能添加你的“不工作”代码吗?并更好地解释“不工作”的实际含义?
  • 它的工作方式与 Java 相同。你可以使用所有的 Java 反射 API,它在 Scala 中的工作方式是一样的。

标签: java scala reflection static


【解决方案1】:

我刚刚解决了这个问题,在我的搜索中找到了这个问题,所以为了拯救那些也通过谷歌搜索找到这个问题的人:

如果你有一个 scala TypeTagWeakTypeTag,实际上可以获取底层 java 类的 java.lang.Class 对象,然后你可以使用 java 反射 API 来做你想做的事做:

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> val wt = weakTypeTag[java.text.DateFormat]
wt: reflect.runtime.universe.WeakTypeTag[java.text.DateFormat] = TypeTag[java.text.DateFormat]

scala> val clazz = wt.mirror.runtimeClass(wt.tpe)
clazz: Class[_] = class java.text.DateFormat

scala> val fld = clazz.getDeclaredField("SHORT")
fld: java.lang.reflect.Field = public static final int java.text.DateFormat.SHORT

scala> val meth = clazz.getDeclaredMethod("getTimeInstance", fld.getType)
meth: java.lang.reflect.Method = public static final java.text.DateFormat java.text.DateFormat.getTimeInstance(int)

scala> val methResult = meth.invoke(null, fld.get(null))
methResult: Object = java.text.SimpleDateFormat@b4dc7db3

scala> methResult.asInstanceOf[java.text.Format].format(System.currentTimeMillis)
res28: String = 9:15 AM

the accepted answer on this question 致敬,这为我指明了正确的方向。

请注意,伴随对象的 scala 方法是完全不同的鱼。 This different SO question 可能会帮助您。

【讨论】:

    【解决方案2】:

    如果你指的是 scala-reflect.jar 中提供的 Scala 原生运行时反射 API 的功能,那么答案有两个:

    1. 可以调用用 Scala 编写的“静态”方法(即对象中定义的方法)。
    2. 无法调用用 Java 编写的静态方法(这里有一个问题:https://issues.scala-lang.org/browse/SI-6459)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2016-06-28
      • 2016-11-10
      • 2016-01-27
      相关资源
      最近更新 更多