Scala可以反射静态方法吗?

4
我有一个Java库,我想通过Scala使用反射调用该库中的一些静态函数。我尝试使用Java方式创建了URLClassloader并使用getDeclaredMethod()反射方法,但似乎在Scala中无法正常工作。我正在考虑Scala的方式,但是似乎没有特定实例就无法反映任何方法或字段。那么,在Scala中是否有可能反映静态方法?如果可以,正确的方法是什么?
抱歉,我认为我犯了一个错误,它在Java API中可以正常工作。谢谢大家。

4
似乎在Scala中不起作用。具体是怎样的不起作用? - m0skit0
2
你能添加你的“不工作”的代码吗?并更好地解释一下“不工作”实际上是什么意思吗? - vptheron
2
它与Java中的使用方式完全相同。您可以使用所有Java反射API,并且在Scala中的工作方式完全相同。 - Madoc
2个回答

3

我在搜索中找到了这个问题,现在已经解决了,为了帮助那些通过谷歌搜索找到这个问题的人:

如果你有一个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

致谢这个问题的被接受答案,它指引了我正确的方向。

请注意,在伴生对象上的Scala方法是完全不同的事情。这个不同的SO问题可以帮助你。


2
如果您指的是Scala本地运行时反射API在scala-reflect.jar中提供的功能,则答案有两个方面:
  1. 可以调用由Scala编写的“静态”方法(即在对象中定义的方法)。
  2. 不可能调用由Java编写的静态方法(这里有一个问题:https://issues.scala-lang.org/browse/SI-6459)。

请注意,保留了HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接