Java Scala能反映静态方法吗?
我有一个java库,我想通过Scala使用反射从库中调用一些静态函数。我尝试使用我创建的Java Scala能反映静态方法吗?,java,scala,reflection,static,Java,Scala,Reflection,Static,我有一个java库,我想通过Scala使用反射从库中调用一些静态函数。我尝试使用我创建的URLClassloader的java方式,并通过getDeclaredMethod()反映该方法,但它似乎在Scala中不起作用。我在考虑Scala的方法,但是如果不创建一个特定的实例,似乎没有任何方法或字段可以被反映出来。 那么,是否有可能在Scala中反映静态方法呢?如果是,正确的方法是什么 抱歉,我想我犯了一个错误,它可以与JavaAPI一起工作。感谢guy.如果您提到Scala-reflect.ja
URLClassloader
的java方式,并通过getDeclaredMethod()
反映该方法,但它似乎在Scala中不起作用。我在考虑Scala的方法,但是如果不创建一个特定的实例,似乎没有任何方法或字段可以被反映出来。
那么,是否有可能在Scala中反映静态方法呢?如果是,正确的方法是什么
抱歉,我想我犯了一个错误,它可以与JavaAPI一起工作。感谢guy.如果您提到Scala-reflect.jar中提供的Scala本机运行时反射API的功能,那么答案有两个:
在我的搜索中找到这个问题后,我刚刚解决了这个问题,为了拯救那些通过谷歌搜索也找到这个问题的人: 如果您有一个scala
TypeTag
或WeakTypeTag
,那么实际上可以获得底层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方法对同伴对象的影响是完全不同的。可能会对您有所帮助。“它似乎在Scala中不起作用”不起作用的确切程度如何?您可以添加“不起作用”代码吗?更好地解释“不工作”的真正含义是什么?它的工作原理与Java中的工作原理相同。您可以使用所有Java反射API,并且它在Scala中的工作方式相同。