Scala可以反映静态方法吗?

时间:2014-08-14 19:15:13

标签: java scala reflection static

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

抱歉,我认为我犯了一个错误,它适用于java api。谢谢你...

2 个答案:

答案 0 :(得分:2)

如果您参考scala-reflect.jar中提供的Scala的本机运行时反射API的功能,那么答案是双重的:

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

答案 1 :(得分:2)

我在搜索中找到这个问题之后就解决了这个问题,以便通过Google搜索找到也能找到这个问题的人:

如果您有scala TypeTagWeakTypeTag,实际上可以获取基础java类的java.lang.Class对象,并从那里可以使用java reflection 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可能会帮助您。