我有一个java库,我想通过Scala使用反射从库中调用一些静态函数。我试图使用java的方式,我创建了URLClassloader
,并反映了getDeclaredMethod()
的方法,但它似乎不工作在Scala。我在考虑Scala的方式,但是如果没有创建特定的实例,似乎没有方法或字段可以反映。那么,是否有可能在Scala中反映静态方法?如果是,正确的做法是什么?
对不起,我想我犯了一个错误,它可以很好地与java api。由于人. .
我刚刚解决了这个问题,在我的搜索中发现了这个问题,所以为了拯救那些也通过谷歌找到这个问题的人:
如果你有一个scala TypeTag
或WeakTypeTag
,它实际上是可能获得java.lang.Class
对象的底层java类,从那里你可以使用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问题可能会帮助你。
如果您指的是Scala -reflect.jar中提供的本机运行时反射API的功能,那么答案是双重的:
- 可以调用Scala编写的"静态"方法(即在对象中定义的方法)。
- 不可能调用用Java编写的静态方法(这是一个问题:https://issues.scala-lang.org/browse/SI-6459)。