我有一个java库,我想通过Scala使用反射从库中调用一些静态函数。我尝试使用我创建的URLClassloader
的java方式,并通过getDeclaredMethod()
反映了该方法,但它似乎在Scala中不起作用。我正在考虑Scala的方式,但似乎没有创建特定实例就无法反映任何方法或字段。
那么可以在Scala中反映静态方法吗?如果是,那么正确的做法是什么?
抱歉,我认为我犯了一个错误,它适用于java api。谢谢你...
答案 0 :(得分:2)
如果您参考scala-reflect.jar中提供的Scala的本机运行时反射API的功能,那么答案是双重的:
答案 1 :(得分:2)
我在搜索中找到这个问题之后就解决了这个问题,以便通过Google搜索找到也能找到这个问题的人:
如果您有scala TypeTag
或WeakTypeTag
,实际上可以获取基础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可能会帮助您。